如何在FastAPI中获取带有域名的当前路径?

23

我有一个简单的路由,如下所示,是用FastAPI编写的:

from fastapi import FastAPI

app = FastAPI()


@app.get("/foo/bar/{rand_int}/foo-bar/")
async def main(rand_int: int):
    return {"path": f"https://some-domain.com/foo/bar/{rand_int}/foo-bar/?somethig=foo"}

如何通过编程获取以下内容的当前路径:

  • 域名 (some-domain.com)
  • 路径 (/foo/bar/{rand_int}/foo-bar/)
  • 查询参数 (?somethig=foo)

有些人想知道如何获取原始的URL路径,例如,/foo/bar/{rand_int}/foo-bar/而不是/foo/bar/1/foo-bar/,你可能会发现这个答案有帮助。 - undefined
2个回答

35
我们可以使用Request.url-(starlette doc) API来获取各种URL属性。要获取绝对URL,我们需要使用Request.url._url私有API(或str(Request.url)),如下所示。
from fastapi import FastAPI, <b>Request</b>

app = FastAPI()


@app.get("/foo/bar/{rand_int}/foo-bar/")
async def main(rand_int: int, <b>request: Request</b>):
    return {"raw_url": <b>str(request.url)</b>}

11
为避免访问私有变量,也可以调用str(request.url)来获取URL的字符串表示形式。 - Abbas
7
不错的观点,更加符合Python风格。我在f-strings中使用它,例如 f"{request.url}: {some_log_message}" - Jason R Stevens CFA

1
在最新版本的FastAPI(0.103.1)中,
使用from fastapi import Request中的Request模块,我们可以获取域名、路径和查询参数。
使用
domain = request.base_url
path = request.url.path
query_params = request.query_params

例子会是这样的
from fastapi import FastAPI, Request

app = FastAPI()


@app.get("/foo/bar/{rand_int}/foo-bar/")
async def main(rand_int: int, request: Request):
    domain = request.base_url
    path = request.url.path
    query_params = request.query_params

    return {"domain": domain, "path": path, "query_params": query_params}

1
请注意,对于查询参数,如果您希望某个键具有多个值,使用dict(request.query_params)可能不会按预期工作。请参阅此答案此答案以获取更多详细信息和解决方案。 - undefined
是的,没有考虑到那种情况,今天遇到了这个问题,所以给出了这个解决方案。对于那种情况,你提供的解决方案是否有效,还是需要编写一个定制的解析器,而不是使用默认的解析器? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接