Fastapi 进阶二:Fastapi中间件
FastAPI 中间件概述
在 FastAPI 框架中,中间件(Middleware)是一种用于在请求到达路由处理函数之前或响应返回客户端之前进行额外处理的机制。中间件可以用于执行各种任务,例如身份验证、日志记录、请求修改、跨域资源共享(CORS)控制等。通过中间件,开发者可以在不修改业务逻辑代码的情况下,增强或改变请求和响应的处理流程。FastAPI 提供了多种内置中间件,并支持自定义中间件的开发,使得开发者能够灵活地扩展应用的功能。
中间件在 FastAPI 中扮演着至关重要的角色。它允许开发者在请求处理的各个阶段插入自定义逻辑,从而实现统一的请求处理策略。例如,CORS 中间件可以用于解决浏览器跨域请求的问题,HTTPSRedirectMiddleware 可以强制将 HTTP 请求重定向到 HTTPS,而 TrustedHostMiddleware 则可以防止恶意的主机头攻击。此外,开发者还可以基于 BaseHTTPMiddleware 自定义中间件,以满足特定的需求,如记录请求日志、添加链路追踪 ID 或实现 IP 白名单控制。
FastAPI 中间件的核心功能是处理请求和响应的中间层逻辑,为应用程序提供统一的处理方式。通过合理使用中间件,开发者可以提高代码的可维护性、增强系统的安全性,并优化请求处理流程。在接下来的内容中,我们将深入探讨 FastAPI 中间件的使用方式,包括内置中间件的配置、自定义中间件的实现,以及具体的应用场景。
使用 @app.middleware 装饰器创建中间件
在 FastAPI 中,@app.middleware 装饰器提供了一种便捷的方式来定义自定义中间件。通过该装饰器,开发者可以编写一个异步函数,并将其注册为中间件,从而在请求处理过程中执行自定义逻辑。FastAPI 的中间件本质上是一个异步函数,接收 request 和 call_next 作为参数,并返回一个 Response 对象。其中,request 表示当前的请求对象,call_next 是一个函数,用于将请求传递给下一个中间件或最终的路由处理函数。
使用 @app.middleware 装饰器创建中间件的基本语法如下:
from fastapi import FastAPI, Request
from fastapi.responses import JSONResponseapp = FastAPI()@app.middleware("http")
async def custom_middleware(request: Request, call_next):# 在请求到达路由处理函数之前执行的逻辑print("Before request processing")response = await call_next(request) # 将请求传递给下一个中间件或路由处理函数# 在响应返回客户端之前执行的逻辑print("After response generation")return response
在上述示例中,@app.middleware("http") 表示该中间件仅应用于 HTTP 请求。中间件函数接收 request 和 call_next 两个参数,并在处理完请求后调用 call_next(request) 来继续请求的处理流程。开发者可以在 call_next 之前或之后添加自定义逻辑,例如记录请求信息、修改请求头或处理响应内容。
通过 @app.middleware 装饰器,开发者可以轻松地在 FastAPI 应用中插入自定义中间件,以满足特定的业务需求。这种中间件机制使得请求处理流程更加灵活,同时保持代码的可维护性和可扩展性。在实际应用中,开发者可以利用这一机制实现诸如身份验证、日志记录或性能监控等功能。
使用 CORSMiddleware 解决跨域问题
在 Web 开发中,由于浏览器的同源策略(Same-Origin Policy),前端应用与后端 API 之间的跨域请求(Cross-Origin Request)可能会受到限制。当浏览器检测到请求的源(协议、域名、端口)与目标 API 不一致时,会阻止请求的执行。为了解决这一问题,FastAPI 提供了内置的 CORSMiddleware,用于处理跨域请求,并通过配置允许特定的来源、方法和头信息,从而确保 API 可以被合法的前端应用访问。
在 FastAPI 应用中,可以通过 app.add_middleware 方法添加 CORSMiddleware,并传入相关配置参数。以下是一个完整的代码示例,展示如何在 FastAPI 应用中配置 CORSMiddleware 以允许跨域请求:
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddlewareapp = FastAPI()# 配置 CORSMiddleware
app.add_middleware(CORSMiddleware,allow_origins=["*"], # 允许所有来源,也可以指定具体的域名allow_credentials=True, # 是否允许跨域请求携带凭证(如 Cookie)allow_methods=["*"], # 允许所有 HTTP 方法allow_headers=["*"], # 允许所有请求头
)@app.get("/")
def read_root(