Jupyter AI

25 中间件与依赖注入之中间件的概念与使用

📅 发表日期: 2024年8月18日

分类: 🚀Python FastAPI 入门

👁️阅读: --

在上一篇文章中,我们探讨了如何在 FastAPI 中进行错误处理,尤其是处理 HTTP 异常响应。本文将重点介绍中间件的概念以及如何在 FastAPI 中使用中间件。接下来,我们将为即将到来的依赖注入主题做好铺垫。

中间件的概念

在 Web 应用程序中,中间件是位于请求和响应处理之间的组件。它们通常用于:

  • 记录日志
  • 跨域资源共享(CORS)
  • 身份验证和授权
  • 请求修改
  • 响应修改
  • 处理请求失败的情况

在 FastAPI 中,中间件可以通过 FastAPI 的应用实例添加,它们会包裹在请求处理的过程之间。

创建中间件

要在 FastAPI 中创建中间件,我们需要使用 starlette.middleware 模块。下面是一个简单的中间件示例,它会在每个请求时记录请求的路径。

from fastapi import FastAPI
from starlette.middleware.base import BaseHTTPMiddleware

class SimpleLoggingMiddleware(BaseHTTPMiddleware):
    async def dispatch(self, request, call_next):
        # 在请求处理之前执行的操作
        print(f"请求路径: {request.url.path}")
        
        # 调用下一个中间件/处理程序
        response = await call_next(request)
        
        # 在请求处理之后执行的操作
        print(f"返回状态: {response.status_code}")
        
        return response

app = FastAPI()

# 添加中间件
app.add_middleware(SimpleLoggingMiddleware)

@app.get("/")
async def read_root():
    return {"message": "Hello, World!"}

在这个例子中,我们创建了一个 SimpleLoggingMiddleware 类,它继承了 BaseHTTPMiddleware。这个中间件会在每个请求被处理时,记录请求的路径与响应的状态码。这对于调试和跟踪请求流程非常有帮助。

中间件的顺序

请注意,中间件的执行顺序是依据它们添加的顺序。最先添加的中间件会在请求处理链的最外层,最后添加的中间件会在请求链的最内层。以下是一个示例:

class FirstMiddleware(BaseHTTPMiddleware):
    async def dispatch(self, request, call_next):
        print("第一中间件开始")
        response = await call_next(request)
        print("第一中间件结束")
        return response

class SecondMiddleware(BaseHTTPMiddleware):
    async def dispatch(self, request, call_next):
        print("第二中间件开始")
        response = await call_next(request)
        print("第二中间件结束")
        return response

app.add_middleware(FirstMiddleware)
app.add_middleware(SecondMiddleware)

在这个示例中,输出将会是:

第一中间件开始
第二中间件开始
第二中间件结束
第一中间件结束

这说明第一个中间件包裹了整个处理过程,而第二个中间件是在它的内部执行。

快速总结

  • 中间件是请求和响应之间的处理层,可以用于多种目的,例如日志记录、身份验证和请求修改等。
  • 在 FastAPI 中,可以通过 add_middleware 方法添加中间件。
  • 中间件的执行顺序是基于添加的顺序。

在接下来的文章中,我们将深入探讨依赖注入的基本用法。这是 FastAPI 的一个强大特性,可以帮助我们更好地管理应用程序的依赖关系。

希望本篇关于中间件的概念与使用的讨论能帮助你更好地理解 FastAPI 的工作机制!

🚀Python FastAPI 入门 (滚动鼠标查看)