fastapi定义装饰器
时间: 2024-07-23 16:01:00 浏览: 116
FastAPI是一个轻量级的Web框架,它使用Python的asyncio库来构建高性能的API。其中的装饰器是FastAPI的核心特性之一,用于简化路由、请求处理、响应处理等功能的定义。
1. **@app.get()**:这是最常见的装饰器,用于定义HTTP GET路由。例如,`@app.get("/items/{item_id}")`会告诉FastAPI当接收到GET请求到"/items/"路径后面跟着一个动态ID时,应该运行与该装饰器关联的函数。
2. **@router.post()**:类似地,`@router.post("/users/")`定义了一个POST路由,通常处理用户数据的创建。
3. **@ Depends()**:这是一个功能强大的依赖注入装饰器,可以用于处理认证、状态管理等,确保只有授权的请求才能访问某些资源。
4. **@router.middleware("http")**:用于添加全局中间件,可以在所有请求上下文中执行操作。
5. **@APIBody()**:用于描述请求体的结构,帮助客户端生成正确的输入示例。
使用装饰器使得FastAPI的API设计简洁明了,同时保持了代码的组织性和可读性。
相关问题
fastapi装饰器中间件
### 实现和使用装饰器中间件
在 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) 响应。
fastapi 拦截器过滤器
在FastAPI中,可以使用拦截器(middleware)和过滤器(dependency)来处理请求和响应。它们都可以在请求到达路由处理函数之前或之后执行一些操作,但它们的作用和使用方法不太一样。
拦截器是在请求到达路由处理函数之前或之后执行的一系列操作,它们可以用于记录请求日志、身份验证、异常处理等操作。使用FastAPI的拦截器可以很方便地实现这些操作,例如:
```python
from fastapi import FastAPI, Request
app = FastAPI()
@app.middleware("http")
async def log_requests(request: Request, call_next):
"""
记录请求日志的拦截器
"""
print(f"Received request: {request.method} {request.url}")
response = await call_next(request)
print(f"Sent response: {response.status_code}")
return response
```
在这个例子中,我们定义了一个记录请求日志的拦截器,它会在每次请求到达路由处理函数之前打印请求信息,并在响应返回后打印响应信息。这个拦截器使用了FastAPI的`middleware`装饰器,它指定了拦截器的类型为`http`,表示它要处理HTTP请求。
过滤器是在请求到达路由处理函数之前执行的一系列操作,它们可以用于身份验证、请求参数校验等操作。使用FastAPI的过滤器可以很方便地实现这些操作,例如:
```python
from fastapi import FastAPI, Depends
app = FastAPI()
async def check_token(token: str):
"""
检查token的依赖性
"""
if token != "secret_token":
raise HTTPException(status_code=401, detail="Invalid token")
@app.get("/")
async def read_root(token: str = Depends(check_token)):
"""
需要token验证的路由处理函数
"""
return {"Hello": "World"}
```
在这个例子中,我们定义了一个需要token验证的路由处理函数,并使用了`Depends`装饰器来指定依赖性。这个依赖性函数`check_token`会在请求到达路由处理函数之前执行,它会检查请求中的token参数是否正确。如果token不正确,则会抛出一个HTTP异常,返回401错误码。
希望这些信息能够帮助您了解FastAPI中的拦截器和过滤器。
阅读全文