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

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

中间件的概念

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

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

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

创建中间件

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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。这个中间件会在每个请求被处理时,记录请求的路径与响应的状态码。这对于调试和跟踪请求流程非常有帮助。

中间件的顺序

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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)

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

1
2
3
4
第一中间件开始
第二中间件开始
第二中间件结束
第一中间件结束

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

快速总结

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

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

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

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

https://zglg.work/python-fastapi-zero/25/

作者

IT教程网(郭震)

发布于

2024-08-17

更新于

2024-08-18

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论