gpt4 book ai didi

python - 如何将自定义装饰器添加到FastAPI路由?

转载 作者:行者123 更新时间:2023-12-03 15:18:42 25 4
gpt4 key购买 nike

我想在我的端点上添加一个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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com