我想在我的端点上添加一个auth_required
装饰器。
(请考虑到这个问题是关于装饰器的,而不是中间件的)
因此,一个简单的装饰器看起来像这样:
def auth_required(func):
def wrapper(*args, **kwargs):
if user_ctx.get() is None:
raise HTTPException(...)
return func(*args, **kwargs)
return wrapper
因此,有两种用法:@auth_required
@router.post(...)
或者@router.post(...)
@auth_required
第一种方法不起作用,因为router.post
创建了一个保存到APIRouter对象的self.routes
中的路由器。第二种方法行不通,因为它无法验证pydantic对象。对于任何请求模型,它都表示missing args, missing kwargs
。所以我的问题是-如何将任何装饰器添加到FastAPI端点?我应该进入
router.routes
并修改现有端点吗?还是使用一些像functools.wraps
这样的函数?
最佳答案
How can I add any decorators to FastAPI endpoints?
如您所说,您需要使用
@functools.wraps(...)
--(PyDoc)装饰器,from functools import wraps
from fastapi import FastAPI
from pydantic import BaseModel
class SampleModel(BaseModel):
name: str
age: int
app = FastAPI()
def auth_required(func):
@wraps(func)
async def wrapper(*args, **kwargs):
return await func(*args, **kwargs)
return wrapper
@app.post("/")
@auth_required # Custom decorator
async def root(payload: SampleModel):
return {"message": "Hello World", "payload": payload}
此方法的主要警告是,您无法在包装器中访问request
对象,并且我认为这是您的主要意图。如果您需要访问请求,则必须将参数添加到路由器功能中,如下所示:
from fastapi import Request
@app.post("/")
@auth_required # Custom decorator
async def root(request: Request, payload: SampleModel):
return {"message": "Hello World", "payload": payload}
我不确定FastAPI中间件怎么了,毕竟
@app.middleware(...)
还是装饰器。
关于python - 如何将自定义装饰器添加到FastAPI路由?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64497615/