一文掌握异步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,一经查实,立即删除!

相关文章

代码随想录算法训练营第二十四天|Day24 回溯算法

93.复原IP地址 题目链接/文章讲解:https://programmercarl.com/0093.%E5%A4%8D%E5%8E%9FIP%E5%9C%B0%E5%9D%80.html 视频讲解:https://www.bilibili.com/video/BV1XP4y1U73i/ 思路 char** result; int resultTop; int segments[3]; int isValid(char* s…

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

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

【drone】drone 整合 gitea | ubuntu 通过docker-compose方式部署drone的全流程 整合gitea

一、前期准备 1、ubuntu环境 确定是否具有 ssh: service ssh start,如果没有,使用:apt install openssh-server 进行安装查看 Linux 的 IP 地址: ifconfig,命令不可用时,通过:apt install net-tools安装命令可选:设置 root 的密码: sudo passwd root可选:开启 root…

使用Python读取word表格里的数据,存为excel表格,以此来解决word表格复制到excel表格一个单元格变过个单元格的问题

一、前言 最近同事遇到一个棘手的事情,要把有1000多行的word表格,转成excel表格,采取直接复制的方式,word里面表格的内容有很多的回车,导致表格复制到excel后,word里一个单元格在excel里变成了多个单元格。…

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

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

如何在verilog设计的磁盘阵列控制器中实现不同RAID级别(如RAID 0、RAID 1等)的切换?

以下是一种在Verilog设计的磁盘阵列控制器中实现不同RAID级别(以RAID 0和RAID 1为例)切换的方法: 添加控制信号 在磁盘阵列控制器模块中添加一个输入信号,例如raid_mode,用于选择RAID模式。假设raid_mode = 0表示RAID 0模式,raid_mode = 1表示RAID 1模式。module raid_co…

前端算法:堆

目录 一、堆 1.堆是什么? 2.堆的性质 3.堆的实现 4.基本操作 5.时间复杂度 二、代码实现 1.最大堆实现 2.最小堆实现 一、堆 1.堆是什么? 堆能用树来表示,并且一般树的实现都是通过链表,而二叉堆是一种特殊的堆&#xf…

GO基础(string相关)

本博文包含了18个小内容,有判断字符串是否以另一个字符串开头、字符串包含关系判断、4、判断非ASCII编码字符、字符串替换、统计字符串出现的次数、重复字符串、修改字符串大写、修改字符串小写、剔除字符串开头和结尾的空白符号、剔除指定字符、剔除开头字符串、剔…

Lua环境安装

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

蓝桥杯注意事项

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

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

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

【硬啃Dash-Fastapi-Admin】03-requirements-pg.txt 速览

文章目录 dash2.18.1 纯Python的Web应用框架Python Dash库的功能介绍和用法示例功能介绍用法示例 Flask-Compress1.15 Flask响应数据的压缩功能介绍用法示例注意事项 feffery-antd-charts0.1.0rc5 数据可视化组件库功能介绍用法示例 feffery-antd-components0.3.8 Dash 第三方组…

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

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

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

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

Visual Studio安装图文详解教程

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

centos配置ssh

在CentOS上配置SSH服务主要步骤: 安装OpenSSH服务器: 首先,你需要确保OpenSSH服务器软件包已经安装在你的系统上。你可以使用以下命令来安装它: sudo yum update sudo yum install openssh-server 启动SSH服务: 安装完…

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

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

如何减小 Maven 项目生成的 JAR 包体积 提升运维效率

在使用 Maven 构建 Java 项目时,有时需要减小生成的 JAR 包的体积,以提高部署效率或减少资源消耗。以下是一些有效的方法来减小 JAR 包的体积: 排除不必要的依赖打包时,依赖jar包独立于应用jar包 1. 排除不必要的依赖 通过排除项目…

【15】协方差

在Excel数据分析中,协方差是用于衡量两个变量之间的线性关系的统计量。它可以帮助你判断两个变量是否同向变化(正协方差)或反向变化(负协方差)。协方差的计算结果可以用于进一步分析变量之间的关系,尤其是在投资组合、回归分析和其他多元分析中有着广泛的应用。 1. 什么…

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

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