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

标签 python python-decorators fastapi pydantic

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

相关文章:

amazon-web-services - AWS ECS Service FastAPI 项目存在垃圾邮件 "GET/HTTP/1.1"404 Not Found

sqlalchemy - 如何为FastAPI应用程序编写SQLAlchemy测试装置

python-3.x - 如何在 FastAPI 中提供静态文件

python - 相当于 Python 生成器的 `return`

python - 在同一 View 中使用 django 查询的数据

python - 创建一个保存方法输入的装饰器 - 返回 'NoneType' 对象不可调用

python - Python 中的高阶类

python - 将一组图像拼接在一起的最pythonic方式

python - 根据发生情况合并行,同时维护 Python 中 DataFrame 中的唯一值

python - 为什么不在 Python 函数内部的返回函数上使用括号?