如何为 FastAPI 路由创建一个能够捕获路径参数值的装饰器?

问题描述 投票:0回答:1

我有一个像这样的 FastAPI 路线:

@router.put("/{workflowID}", response_model=WorkflowResponse)
async def update_workflow_endpoint(
    workflowID: int, 
    workflow: WorkflowUpdateRequest, 
    db: AsyncSession = Depends(get_db)
):
    ... // Remaining code

我想写一个获取路径参数的装饰器

workflowID
,就像这样:

@allowed_perm('WF_ADMIN', {workflowID})

因此它获得两个参数 - 字符串

WF_ADMIN
workflowID
路径参数的值。

例如:如果像这样调用 API

/5
,那么我希望装饰器在内部获取
5
的值。

如何做到这一点?我正在尝试构建我的权限模块,虽然我知道这可以使用依赖项来完成,但我想知道是否可以通过装饰器来完成同样的事情。

python fastapi decorator
1个回答
0
投票

是的,您可以通过以下方式实现:

from functools import wraps
from fastapi import HTTPException

def allowed_perm(role: str, param_name: str):
    def decorator(func):
        @wraps(func)
        async def wrapper(*args,**kwargs):
            workflowID =kwargs.get(param_name)
            if workflowID is None:
                raise HTTPException(status_code=400, detail="ERROR")
            
            if role != "WF_ADMIN":
                raise HTTPException(status_code=403,detail="Permision denied")
            return await func(*args, **kwargs)
        return wrapper
    return decorator


@router.put("/{workflowID}", response_model=WorkflowResponse)
@allowed_perm('WF_ADMIN', 'workflowID')
async def update_workflow_endpoint(
    workflowID: int, 
    workflow: WorkflowUpdateRequest, 
    db: AsyncSession = Depends(get_db),
):
    ...
© www.soinside.com 2019 - 2024. All rights reserved.