一文掌握异步web框架FastAPI(五)-- 中间件(测试环境、访问速率限制、请求体解析、自定义认证、重试机制、请求频率统计、路径重写)

接上篇:一文掌握异步web框架FastAPI(四)-CSDN博客

目录

七、中间件

 15、测试环境中间件

16、访问速率限制中间件,即限制每个IP特定时间内的请求数(基于内存,生产上要使用数据库)

        1)限制单ip访问速率

        2)增加限制单ip并发(跟上面的一样,也是限制每个IP特定时间内的请求数,另一种写法)

        3)增加封禁IP

17. 请求体解析中间件

18. 自定义认证中间件

19. 重试机制中间件

20. 请求频率统计中间件(各个接口的访问次数)

21. 路径重写中间件


七、中间件

 15、测试环境中间件

这个中间件用于识别请求是否来自于测试环境,并采取相应的措施,如禁用缓存或跳过某些安全检查。

from fastapi import FastAPI, Request, HTTPException
from fastapi.responses import JSONResponse
import os
import logging# 配置日志
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
app = FastAPI()@app.middleware("http")
async def test_environment_middleware(request: Request, call_next):try:# 检查环境变量test_environment_enabled = os.getenv("TEST_ENVIRONMENT_ENABLED", "false").lower() == "true"if "X-Test-Environment" in request.headers and request.headers["X-Test-Environment"].lower() == "true":if test_environment_enabled:logger.info("Test environment header detected. Enabling test environment specific logic.")# 测试环境特有的处理# 例如:设置数据库连接为测试数据库、开启调试模式等passelse:logger.warning("Test environment header detected, but TEST_ENVIRONMENT_ENABLED is not set to true.")return JSONResponse({"message": "Test environment not enabled"}, status_code=403)response = await call_next(request)return responseexcept Exception as e:logger.error(f"Error in test_environment_middleware: {str(e)}")return JSONResponse({"message": "Internal server error"}, status_code=500)@app.get("/")
async def root():return {"message": "Hello World"}if __name__ == "__main__":import uvicornuvicorn.run(app, host="0.0.0.0", port=8000)

请求:

import requests# FastAPI应用的URL
url = "http://127.0.0.1:8000/"
# 发送GET请求到根路径,并包含测试环境头部
response = requests.get(url, headers={"X-Test-Environment": "true"})
# 打印响应状态码和内容
print(f"Status Code: {response.status_code}")
print(f"Response Content: {response.json()}")

本地未启用测试环境:

16、访问速率限制中间件,即限制每个IP特定时间内的请求数(基于内存,生产上要使用数据库)

        1)限制单ip访问速率
from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse
import time
from collections import defaultdict
import loggingapp = FastAPI()
# 初始化rate_limits字典
rate_limits = defaultdict(list)
# 配置日志
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)# 定义中间件
@app.middleware("http")
async def rate_limit_middleware(request: Request, call_next):ip = request.headers.get("X-Forwarded-For", request.client.host).split(",")[0].strip()now = time.time()# 移除旧的请求时间戳rate_limits[ip] = [t for t in rate_limits[ip] if t > now - 60]# 检查速率限制if len(rate_limits[ip]) >= 10:  # 限制为每分钟10个请求logger.debug(f"Rate limit exceeded for IP: {ip}")return JSONResponse(status_code=429,content={"detail": "Too Many Requests"})# 添加当前请求的时间戳rate_limits[ip].append(now)# 继续处理请求response = await call_next(request)return response# 定义路由
@app.get("/")
async def root():return {"message": "Hello World"}# 启动应用
if __name__ == "__main__":import uvicornuvicorn.run(app, host="0.0.0.0", port=8000, log_level="debug")

请求:

import requests
import time# FastAPI应用的URL
url = "http://127.0.0.1:8000/"
# 用于测试的IP地址
ip = "127.0.0.1"
# 设置请求头,模拟X-Forwarded-For
headers = {"X-Forwarded-For": ip
}# 发送多个请求以测试速率限制
def test_rate_limit():for i in range(15):try:response = requests.get(url, headers=headers)print(f"Request {i + 1}: Status Code: {response.status_code}")if response.status_code == 429:print(f"Request {i + 1}: {response.json()}")except Exception as e:print(f"Request {i + 1}: Error: {e}")time.sleep(1)  # 等待1秒

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/57451.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大模型算法二次开发,基本思路详细拆解

[ 导读 随着众多大模型相继问世,大模型二次开发、大模型微调成为一项热门技术。本文为大家总结了大模型二次开发的基本方法与思路,希望对大家有所帮助。 开发方法分类 1、领域知识注入:Continue PreTraining(增量预训练),一般垂直大模型是…

(STM32笔记)十二、DMA的基础知识与用法

我用的是正点的STM32F103来进行学习,板子和教程是野火的指南者。 之后的这个系列笔记开头未标明的话,用的也是这个板子和教程。 DMA的基础知识与用法 一、DMA功能框图1、DMA请求2、通道3、仲裁器 二、DMA传输设置1、数据来源与数据去向外设到存储器存储器…

Lua环境安装

软考鸭微信小程序 学软考,来软考鸭! 提供软考免费软考讲解视频、题库、软考试题、软考模考、软考查分、软考咨询等服务 Lua是一种轻量级、小巧且易于嵌入应用程序的脚本语言,广泛用于游戏开发、Web开发、自动化脚本等领域。本文将详细介绍如何在不同操作系统上安装L…

蓝桥杯注意事项

蓝桥杯注意事项 比赛注意事项 能暴力枚举就暴力枚举,能用简单的思路做就尽量用简单的思路做。认真审核题目的题意和输入输出的要求,避免因为误解题意而导致题目错误。对于提供多组测试样例或者需要对一个过程重复进行循环的代码,要时刻记住…

六大设计原则之一——单一职责原则

单一职责原则 面向对象三大特性之一的 封装 指的就是将单一事物抽象出来组合成一个类,所以我们在设计类的时候每个类中处理的是单一事物而不是某些事物的集合。 设计模式中所谓的 单一职责原则(Single Responsibility Principle - SRP),就是对一个类而…

autMan奥特曼机器人-实时翻译的用法

一、基本配置 访问并登录百度翻译开放平台:https://api.fanyi.baidu.com/ 进入开发者信息获取 APP ID和密钥,并开通“通用文本翻译”服务 autMan应用市场->我的->找到“实时翻译”插件安装后去点击“配参” 二、使用示例 假如你和一个俄国人聊…

C程序设计语言精髓 单向链表

目录 单向链表---定义 单向链表---建立 单向链表---删除 单向链表---插入​ 单向链表---输出​ 单向链表---定义 单向链表---建立 单向链表---删除 单向链表---插入 单向链表---输出

Visual Studio安装图文详解教程

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 教程说明 本教程旨在详细介绍 Visual Studio 社区版的安装过程及其注意事项。 Visual Studio简介 Visual Studio 社区版功能完备且可扩展的免费 IDE,可用于创…

【通俗理解】Neurosymbolic AI——融合神经网络与符号推理的智慧之力

【通俗理解】Neurosymbolic AI——融合神经网络与符号推理的智慧之力 关键词提炼 #Neurosymbolic AI #神经网络 #符号推理 #感知能力 #逻辑能力 #认知水平 #智慧与力量 第一节:Neurosymbolic AI的类比与核心概念 Neurosymbolic AI就像是给神经网络这位“大力士”…

神策数据客户旅程 GPT:以 AI 驱动客户旅程及埋点落地

数据驱动时代,随着 AI 在数据处理及分析方面的能力日渐强大,将二者结合,可以帮助企业效能提升,获取更多商业价值。 我们在 AI 大模型探索过程中发现,产品经理、技术人员、市场营销人员以及需要数据驱动决策的团队&…

基于opencv的人脸闭眼识别疲劳监测

1. 项目简介 本项目旨在实现基于眼部特征的眨眼检测,通过监测眼睛开闭状态来计算眨眼次数,从而应用于疲劳监测、注意力检测等场景。使用了面部特征点检测算法,以及眼部特征比率(EAR, Eye Aspect Ratio)来判断眼睛的闭…

可观测日北京|观测云:可观测性需要做到“三个一”

2024年10月,备受期待的中国可观测日「北京站」圆满落幕。本次活动汇聚了来自云计算、技术创新等领域的专家,探讨了探讨了可观测性在云计算和数字化转型中扮演的角色。观测云也在活动展示了作为可观测性行业领袖的技术力和创新力。 观测云技术亮点&#…

python画图|坐标轴显隐设置

【1】引言 前序学习中,已经发现坐标轴的显示具有至关重要的影响,因此今天继续探索相关技巧:坐标轴显隐设置。 前序学习内容可通过下述链接直达: python画图| 对齐图名和标签-CSDN博客 【2】官网教程 点击下方链接可以直达官网…

react 基础学习笔记

1.react 语法 ①数据渲染 函数组件将HTML结构直接写在函数的返回值中 JSX只能有一个根元素 JSX插值写法 插值可以使用的位置 1.标签内容; 2.标签属性 JSX 条件渲染:三目运算符; JSX根据数据进行列表渲染:map()方法&#x…

【读书笔记-《网络是怎样连接的》- 2】Chapter2_1-协议栈通信详细过程

第二章从协议栈这部分来看网络中的通信如何实现,准备从两部分来进行分解。本篇是第一部分:详细介绍TCP协议栈收发数据的过程。 首先来看下面的图。从应用程序到网卡需要经过如下几部分,上面的部分通过委托下面的部分来完成工作。首先是应用程…

Windows 10、Office 2016/2019 和 PPTP 和 L2TP协议即将退役,企业应尽早做好准备

关心微软技术和产品的朋友一定对这个网站很熟悉:https://microsoftgraveyard.com/,这里静静的躺着很多微软技术和产品。近日,微软又在准备一场新的“告别仪式”了,这次是 Windows 10、Office 2016/2019 和一些老旧的协议与技术。让…

Apache Seata 新版本集成了 RocketMQ 事务消息

大家好,我是君哥。 Apache Seata 是一款高性能、简单易用的分布式事务中间件,它包含 AT、TCC、SAGA 和 XA 四种模式。 在最近发布的新版本中,Apache Seata 引入了 RocketMQ 中间件,并且跟 RocketMQ 的事务消息配合使用。今天我们…

Vue Router实现路由懒加载

为了提高页面的加载速度,我们可以使用Vue Router的路由懒加载功能。路由懒加载是什么呢,路由懒加载就是只有当访问某个路由的时候再加载其相应的页面。 官方文档地址https://router.vuejs.org/guide/advanced/lazy-loading.html 以前我写路由懒加载的时候…

详细教程:使用Grafana监控Mysql

什么是Grafana Grafana是一个跨平台的开源的度量分析和可视化工具,可以通过将采集的数据查询然后可视化的展 示,并及时通知。 下载Grafana 下载地址: https://grafana.com/grafana/download [rootgrafana ~]# wget https://dl.grafana.com/oss/relea…

qt QPushButton详解

QPushButton是Qt Widgets模块中的一个基本控件,用于提供可点击的按钮。它是用户界面中最为常见和常用的控件之一,通过点击按钮,用户可以触发特定的应用程序操作。 重要方法 QPushButton(const QIcon &icon, const QString &text, QWi…