我有一个像这样的 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
的值。
如何做到这一点?我正在尝试构建我的权限模块,虽然我知道这可以使用依赖项来完成,但我想知道是否可以通过装饰器来完成同样的事情。
是的,您可以通过以下方式实现:
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),
):
...