fastapi装饰器中间件
时间: 2024-12-26 11:14:36 浏览: 4
### 实现和使用装饰器中间件
在 FastAPI 中,虽然官方推荐的方式是通过 `add_middleware` 方法来添加中间件[^1],也可以利用 Python 的装饰器模式创建自定义中间件。这种方式允许更灵活地控制特定视图函数的行为。
下面是一个例子展示如何构建并应用基于装饰器的中间件:
#### 定义装饰器中间件
首先编写一个简单的装饰器用于模拟中间件功能,比如验证 token:
```python
from functools import wraps
from fastapi import Request, HTTPException
from typing import Callable
def verify_token_decorator(token_secret: str) -> Callable:
""" 创建一个带参数的装饰器 """
def decorator(func):
@wraps(func)
async def wrapper(request: Request, *args, **kwargs):
# 获取请求头中的 Authorization 字段
authorization_header = request.headers.get('Authorization')
if not authorization_header or authorization_header != f'Bearer {token_secret}':
raise HTTPException(status_code=403, detail="Invalid Token")
return await func(*args, **kwargs)
return wrapper
return decorator
```
此代码片段展示了如何创建名为 `verify_token_decorator` 的装饰器工厂函数,它接受一个参数 `token_secret` 并返回实际的装饰器逻辑。该装饰器会检查传入请求头部是否有合法的身份认证令牌[^2]。
#### 应用装饰器至路由处理器
接着可以将上述定义好的装饰器应用于具体的路径操作上:
```python
from fastapi import FastAPI
app = FastAPI()
# 使用装饰器保护某个端点
@app.post("/protected-endpoint/")
@verify_token_decorator("mysecretkey") # 这里填入真实的密钥字符串
async def protected_endpoint():
return {"message": "This is a protected resource"}
```
这里演示了怎样把前面编写的 `verify_token_decorator` 装饰器附加到 `/protected-endpoint/` POST 请求处理程序之上。只有携带有效身份凭证(即正确格式化的 Bearer Token)才能访问这个受保护资源;否则将会收到权限不足 (403 Forbidden) 响应。
阅读全文