[英]FastAPI: How to get raw URL path from request?
我在路径中有一个带有请求参数的GET
方法:
@router.get('/users/{user_id}')
async def get_user_from_string(user_id: str):
return User(user_id)
是否可以从请求中获取基本 url 原始路径(即'/users/{user_id}'
)?
我尝试使用以下方式:
path = [route for route in request.scope['router'].routes if
route.endpoint == request.scope['endpoint']][0].path
但它不起作用,我得到:
AttributeError:“安装”object 没有属性“端点”
根据 FastAPI 文档:
由于FastAPI其实在下面是Starlette,上面有一层几个工具,需要的时候可以直接使用Starlette的
Request
object。
因此,您可以使用Request
object 来获取 URL 路径。 例如:
from fastapi import FastAPI, Request app = FastAPI() @app.get('/users/{user_id}') async def get_user(user_id: str, request: Request): print(request.url.path) return "something"
例如,上面将打印/users/1
(如果传递的user_id
为1
)。
但是,如果您需要的是端点的实际路径,即/users/{user_id}
,那么您可以使用以下内容:
@app.get("/users/{user_id}") async def get_user(user_id: str, request: Request): p = [route.path for route in app.routes if route.name == request.scope['endpoint'].__name__] print(p[0]) return "something"
如果改为使用APIRouter ,则可以使用以下内容:
for route in request.scope['router'].routes
或者,您可以使用Request
object 获取app
实例(如此处和此处所述)
for route in request.app.routes
注意:您总是可以通过简单地将其存储在变量中来获得上述路径,因为您事先已经知道路由的路径。
我正在为 OpenTelemetry 实现此功能,使用可用数据获取原始路由的方法如下:
def get_route_from_request(req):
root_path = req.scope.get("root_path", "")
route = scope.get("route")
if not route:
return None
path_format = getattr(route, "path_format", None)
if path_format:
return f"{route_path}{path_format}"
return None
请注意,接受的答案没有返回所询问的内容,因为它返回了服务器接收到的路径。
其他答案均不涉及已安装的应用程序。
最后,检查端点名称的答案也是错误的,因为相同的 function 可以用于不同的端点。
找到两个不起作用的答案后,我将分享我使用的内容。 好像路径参数中有共享值它不起作用,这不是很好
path = request.url.path for key, val in request.path_params.items(): path = path.replace(val, F'{{{key}}}')
您可以使用请求中的 APIRouter object 属性来获取真实路径
例子:
raw_path = request.scope['route'].path #'/user/{id}'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.