什么是中间件?
中间件(Middleware)是位于 Web 服务器和应用程序之间的组件,它可以处理每个请求和响应。中间件的主要作用是在请求到达应用程序之前或响应返回客户端之前对其进行处理。中间件可以执行各种任务,如日志记录、身份验证、请求解析、响应压缩等。
中间件的作用
-
日志记录:
- 记录请求的时间、方法、路径等信息,便于调试和监控。
-
身份验证和授权:
- 检查请求是否包含有效的认证信息,确保只有授权用户可以访问特定资源。
-
请求解析:
- 解析请求体,提取所需的数据,以便应用程序处理。
-
响应处理:
- 修改响应头,添加缓存控制、内容编码等信息。
- 压缩响应体,减少传输数据量。
-
错误处理:
- 捕获和处理应用程序中的异常,返回友好的错误信息。
-
性能监控:
- 记录请求的处理时间,监控应用程序的性能。
示例代码中的中间件
在你的示例代码中,定义了两个中间件:TimeCalculateMiddleware
和 AuthMiddleware
。
1. TimeCalculateMiddleware
class TimeCalculateMiddleware(BaseHTTPMiddleware):
async def dispatch(self, request: Request, call_next):
print('TimeCalculateMiddleware-Start')
start_time = time.time()
response = await call_next(request)
process_time = round(time.time() - start_time, 4)
# 返回接口响应时间
response.headers["X-Process-Time"] = f"{process_time} (s)"
print('TimeCalculateMiddleware-End')
return response
作用:
- 记录请求的处理时间。
- 将处理时间添加到响应头中,方便客户端或监控系统查看。
具体实现:
dispatch
方法是中间件的核心,它接收request
和call_next
两个参数。start_time
记录请求开始的时间。response = await call_next(request)
调用下一个中间件或最终的路由处理函数。process_time
计算请求的处理时间。- 将处理时间添加到响应头中,使用
response.headers["X-Process-Time"]
。 - 打印开始和结束的调试信息。
2. AuthMiddleware
class AuthMiddleware(BaseHTTPMiddleware):
def __init__(self, app, header_value='auth'):
super().__init__(app)
self.header_value = header_value
async def dispatch(self, request: Request, call_next):
print('AuthMiddleware-Start')
response = await call_next(request)
response.headers['Custom'] = self.header_value
print('AuthMiddleware-End')
return response
作用:
- 添加自定义的响应头。
- 在响应头中添加一个
Custom
头,值为header_value
。
具体实现:
__init__
方法初始化中间件,接收app
和header_value
参数。dispatch
方法接收request
和call_next
参数。- 调用
call_next(request)
处理请求。 - 将
Custom
头添加到响应头中,使用response.headers['Custom']
。 - 打印开始和结束的调试信息。
注册中间件
app.add_middleware(TimeCalculateMiddleware)
app.add_middleware(AuthMiddleware, header_value='CustomAuth')
作用:
- 将中间件注册到 FastAPI 应用中。
app.add_middleware
方法用于添加中间件。- 第一个参数是中间件类,第二个参数是传递给中间件构造函数的参数。
路由处理
@app.get("/index")
async def index():
print('index-Start')
return {
'code': 200
}
作用:
- 定义一个简单的路由处理函数,处理
/index
路径的 GET 请求。 - 返回一个 JSON 响应,包含
code
字段。
启动应用
if __name__ == "__main__":
import uvicorn
import os
app_model_name = os.path.basename(__file__).replace(".py", "")
print(app_model_name)
uvicorn.run(f"{app_model_name}:app", host='0.0.0.0', reload=True)
作用:
- 启动 FastAPI 应用。
- 使用
uvicorn
作为 ASGI 服务器。 host='0.0.0.0'
表示应用监听所有网络接口。reload=True
表示启用自动重载,方便开发调试。
总结
中间件在 Web 开发中是非常重要的组件,它们可以处理各种请求和响应的预处理和后处理任务。通过定义和注册中间件,可以实现日志记录、身份验证、性能监控等功能,从而提高应用的健壮性和可维护性。