繁体   English   中英

FastAPI:如何从请求中获取原始 URL 路径?

[英]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_id1 )。

更新

但是,如果您需要的是端点的实际路径,即/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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM