开源模型应用落地-FastAPI-助力模型交互-进阶篇-中间件(四)

server/2025/1/23 15:37:53/

一、前言

FastAPI 的高级用法可以为开发人员带来许多好处。它能帮助实现更复杂的路由逻辑和参数处理,使应用程序能够处理各种不同的请求场景,提高应用程序的灵活性和可扩展性。

在数据验证和转换方面,高级用法提供了更精细和准确的控制,确保输入数据的质量和安全性。它还能更高效地处理异步操作,提升应用程序的性能和响应速度,特别是在处理大量并发请求时优势明显。

此外,高级用法还有助于更好地整合数据库操作、实现数据的持久化和查询优化,以及实现更严格的认证和授权机制,保护应用程序的敏感数据和功能。总之,掌握 FastAPI 的高级用法可以帮助开发人员构建出功能更强大、性能更卓越、安全可靠的 Web 应用程序。

本篇学习FastAPI中高级中间件的相关内容,包括添加ASGI中间件、集成的中间件以及一些具体中间件的用法。


二、术语

2.1. middleware函数

middleware函数(中间件)它在每个请求被特定的路径操作处理之前,以及在每个响应返回之前工作。可以用于实现多种通用功能,例如身份验证、日志记录、错误处理、请求处理、缓存等。其主要作用是在请求和响应的处理过程中添加额外的处理逻辑,而无需在每个具体的路由处理函数中重复编写这些逻辑。

一般在碰到以下需求场景时,可以考虑使用中间件来实现:

  1. 身份验证:验证请求的身份,如检查 JWT token 或使用 OAuth2 进行验证;
  2. 日志记录:记录请求和响应的日志,包括请求方法、URL、响应状态码等信息;
  3. 错误处理:处理应用程序中的异常情况,捕获异常并返回自定义的错误响应;
  4. 请求处理:对请求进行处理,例如解析请求参数、验证请求数据等;
  5. 缓存:在中间件中检查缓存中是否存在请求的响应,如果存在则直接返回缓存的响应。

2.2.HTTPSRedirectMiddleware

强制所有传入请求必须是https或wss,否则将会被重定向。

2.3.TrustedHostMiddleware

强制所有传入的请求都正确设置的host请求头。

2.4.GZipMiddleware

处理任何在请求头Accept-Encoding中包含“gzip”的请求为GZip响应。


三、前置条件

3.1. 创建虚拟环境&安装依赖

conda create -n fastapi_test python=3.10
conda activate fastapi_test
pip install fastapi uvicorn

四、技术实现

4.1. 自定义中间件

# -*- coding: utf-8 -*-
import uvicorn
from fastapi import FastAPI, Request, HTTPException
from starlette import statusapp = FastAPI()black_list = ['192.168.102.88']@app.middleware("http")
async def my_middleware(request: Request, call_next):client_host = request.client.hostprint(f"client_host: {client_host}")if client_host in black_list:raise HTTPException(status_code=status.HTTP_403_FORBIDDEN,detail="Prohibit access")else:response = await call_next(request)return response@app.get("/items/")
async def read_items():return [{"item_id": "Foo"}]if __name__ == '__main__':uvicorn.run(app, host='0.0.0.0',port=7777)

调用结果:

正常访问,未命中黑名单:

非法访问,命中黑名单:

4.2. HTTPSRedirectMiddleware

强制所有传入请求必须是https或wss。

# -*- coding: utf-8 -*-
import uvicornfrom fastapi import FastAPI
from fastapi.middleware.httpsredirect import HTTPSRedirectMiddlewareapp = FastAPI()app.add_middleware(HTTPSRedirectMiddleware)@app.get("/hello")
async def main():return {"message": "Hello World"}if __name__ == '__main__':uvicorn.run(app, host='0.0.0.0', port=7777)

调用结果:

http请求会重定向至https请求

4.3. TrustedHostMiddleware

强制所有传入的请求都正确设置的主机请求头。

# -*- coding: utf-8 -*-
import uvicornfrom fastapi import FastAPI
from fastapi.middleware.trustedhost import TrustedHostMiddlewareapp = FastAPI()app.add_middleware(TrustedHostMiddleware, allowed_hosts=["localhost"]
)@app.get("/hello")
async def main():return {"message": "Hello World"}if __name__ == '__main__':uvicorn.run(app, host='0.0.0.0', port=7777)

调用结果:

使用代码指定的域名:localhost > 正常访问

**使用非代码指定的域名:127.0.0.1 > 禁止访问,提示:**Invalid host header

4.4. GZipMiddleware

处理 Accept-Encoding 标头中包含“gzip”的任何请求,小于minimum_size(默认值是500)将不会执行GZip响应。

# -*- coding: utf-8 -*-
import uvicorn
from fastapi import FastAPI
from starlette.middleware.gzip import GZipMiddlewareapp = FastAPI()app.add_middleware(GZipMiddleware, minimum_size=1)@app.get("/hello")
async def main():return {"message": "Hello World"}if __name__ == '__main__':uvicorn.run(app, host='0.0.0.0', port=7777)

将minimum_size设置成100


五、附带说明

5.1.如何使用 CORSMiddleware 处理 CORS

CORS (Cross-Origin Resource Sharing) - FastAPIFastAPI framework, high performance, easy to learn, fast to code, ready for production[这里是图片011]https://fastapi.tiangolo.com/tutorial/cors/


http://www.ppmy.cn/server/160776.html

相关文章

Docker核心命令与Yocto项目的高效应用

随着软件开发逐渐向分布式和容器化方向演进,Docker 已成为主流的容器化技术之一。它通过标准化的环境配置、资源隔离和高效的部署流程,大幅提高了开发和构建效率。Yocto 项目作为嵌入式 Linux 系统构建工具,与 Docker 的结合进一步增强了开发…

我的图形布局 组织结构图布局

组织结构图布局,有的人也叫它树状布局,在图形中是经常用到的布局算法.形成类似如下图的图形布局方式 首先创建一个类, public class TreeLayouter {private int m_space 40;/// <summary>/// 空间间隔/// </summary>public int Space{get { return m_space; }se…

【18】编写shell-定期删除elastic索引

说明: 1)elastic索引是按日期生成的,所以执行shell脚本每天定时删除索引 2)只保留25天的索引,超过25天的elastic索引被删除,可以根据个人修改 3)日志elastic索引如下图所示: #! /bin/bashset -e# 定义变量 baol_num=25 ELASTIC_USER="elastic" ELASTIC_PASSW…

计算机网络ENSP课设--三层架构企业网络

本课程设计搭建一个小型互联网&#xff0c;并模拟Internet的典型Web服务过程。通过此次课程设计&#xff0c;可以进一步理解Internet的工作原理和协议过程&#xff0c;并提高综合知识的运用能力和分析能力。具体目标包括&#xff1a; &#xff08;1&#xff09;掌握网络拓扑的…

学习ASP.NET Core的身份认证(基于JwtBearer的身份认证6)

重新创建WebApi项目&#xff0c;安装Microsoft.AspNetCore.Authentication.JwtBearer包&#xff0c;将之前JwtBearer测试项目中的初始化函数&#xff0c;jwt配置类、token生成类全部挪到项目中。   重新编写login函数&#xff0c;之前测试Cookie和Session认证时用的函数适合m…

Go项目实战-让自定义Error支持Go的errors.Is判定以及原型模式的应用

经过前面三节高代码强度的学习&#xff0c;相信大家都已经有点累了&#xff0c;本节我们不着急继续“赶路”&#xff0c;休息片刻&#xff01;我们换个轻松点的话题&#xff0c;聊一聊咱们项目定制化Error--AppError 怎么支持Go语言的 errors.Is 判定&#xff0c;以及项目预定义…

论文+AI赋能教育:探索变革路径与创新实践。包括word和pdf格式。

下载地址链接&#xff1a; https://download.csdn.net/download/wanggang130532/90292129https://download.csdn.net/download/wanggang130532/90292129

2024年踩坑经验备份【总结】

与业务方需求方沟通 1、开发进度同步&#xff0c;主动反馈、沟通进展&#xff0c;让需求方心里有数。 开发前 主动沟通需求&#xff0c;不是等别人来找你沟通需求的确认澄清得到结论之后&#xff0c;也用文字描述清楚&#xff0c;在群里cc相关业务方&#xff0c;保证各方信息…