gpt4 book ai didi

python-3.x - FastAPI - 无法从中间件访问路径参数

转载 作者:行者123 更新时间:2023-12-05 03:51:26 26 4
gpt4 key购买 nike

我的典型路径是这样的

/user/{user_id}/resource/{resource_id}

我有一个验证方法,已经用异步 python 编写,如下所示:

async def is_allowed(user_id: int, resource_id: int) -> bool

返回一个 bool 值:如果用户可以访问该资源,则返回 true,否则返回 false。

我想编写一个 中间件 调用 is_allowed 从路径中提取变量。

我四处摸索,但找不到获取它们的方法:我期待从 request.path_params 获取此信息。

一个更完整的例子(根据@Marcelo Trylesinski 的回答编辑):

import logging

from fastapi import FastAPI
from starlette.requests import Request
from starlette.responses import Response

app = FastAPI()

_logger = logging.getLogger()
_logger.setLevel(logging.DEBUG)


async def is_allowed(user_id, resource_id):
_logger.error(user_id)
_logger.error(resource_id)
return True


@app.middleware('http')
async def acl(request: Request, call_next):
user_id = request.path_params.get("user_id", None)
resource_id = request.path_params.get("resource_id", None)
allowed = await is_allowed(user_id, resource_id)
if not allowed:
return Response(status_code=403)
else:
return await call_next(request)


@app.get('/user/{user_id}/resource/{resource_id}')
async def my_handler(user_id: int, resource_id: int):
return {"what": f"Doing stuff with {user_id} on {resource_id}"}

记录的值为

最佳答案

您将无法使用中间件实现您的目标,因为中间件在路由之前执行。

因此 FastAPI/Starlette 不知道它将匹配到哪个路径,也无法填充 path_params

您将不得不使用不同的解决方案,例如将这些参数传递给 cookie、 header 或查询参数,或者使用装饰器/依赖项。

引用:

https://github.com/encode/starlette/issues/230

https://fastapi.tiangolo.com/tutorial/middleware/#middleware

关于python-3.x - FastAPI - 无法从中间件访问路径参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62895883/

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