【问题标题】:FastAPI: How to get raw URL path from request?FastAPI:如何从请求中获取原始 URL 路径?
【发布时间】:2022-06-17 16:56:28
【问题描述】:

我有一个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: 'Mount' 对象没有属性 'endpoint'

【问题讨论】:

标签: python url-routing fastapi


【解决方案1】:

根据 FastAPI documentation:

因为FastAPI其实下面是Starlette,一层有几个 上面的工具,你可以直接使用Starlette的Request对象 需要。

因此,您可以使用Request 对象来获取 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"

【讨论】:

    【解决方案2】:

    你可以使用 Request 的 APIRouter 对象来获取真实的路径,就像 Flask 中的 request.raw_path 一样。 示例:

    raw_path = request.scope['route'].path 
    # raw_path is '/user/{id}'
    

    你可以使用 print(request.scope) 获取所有属性

    {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('127.0. 0.1', 8088), 'client': ('127.0.0.1', 14064), 'scheme': 'http', 'root_path': '', 'headers': [(b'host', b'localhost: 8088'), (b'connection', b'keep-alive'), (b'sec-ch-ua', b'" Not A;Brand";v="99", "Chromium";v=" 102", "Microsoft Edge";v="102"'), (b'accept', b'application/json'), (b'sec-ch-ua-mobile', b'?0'), ( b'user-agent', b'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.63 Safari/537.36 Edg/102.0.1245.33'), (b'token', b'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NTU0OTA1MDMsInN1YiI6IjEifQ.w8AlHgw2g_-r2sBpHqD8vQm9lfKpubiJM0bUuyh44Dc'), (b'sec-ch-ua-platform', b '"Windows"'), (b'sec-fetch-site', b'same-origin'), (b'sec-fetch-mode', b'cors'), (b'sec-fetch-dest' , b'empty'), (b'referer', b'http://localhost:8088/docs'), (b'accept-encoding', b'gzip, deflate, br'), (b'accept-语言', b'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6')], '方法': 'GET', '路径': '/user/2', 'raw_path': b'/user/2', 'query_string': b'', 'app': , 'fastapi_astack': , 'router': , 'endpoint': , 'path_params': {'id': '2'}, 'route' : }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-30
      • 2020-11-29
      • 2010-11-13
      • 2021-02-12
      • 2021-05-02
      • 2021-01-09
      • 1970-01-01
      相关资源
      最近更新 更多