如何在FastAPI中解析URL中的子域名?

1 投票
1 回答
72 浏览
提问于 2025-04-12 21:49

我们的客户将会访问我们新的API,地址是 foo123.bar456.domain.com/v1.5/

这里的 foo123bar456 是特定账户的子域名(这也帮助我们进行负载均衡)。它们表示一些关系,并触发我们需要处理的操作。

我们不想在网址中反复传递查询参数,比如 ....domain.com/v1.5/?acc=foo123&parent=bar456,因为这样做其实不太符合Python的风格。

所以,我想在FastAPI中解析被调用的完整域名。

我找不到关于如何进行这种网址解析的建议,尤其是那些不涉及域名右侧文件夹的。有没有什么建议或提示?谢谢!

1 个回答

1

你可以使用urllib.parse.urlparse()这个函数来处理request.url,这样就能得到主机名或者域名,然后你可以根据需要进一步拆分它。这些方法的灵感来源于这个回答,还有这个回答这个回答

示例

下面这个例子中,当你在浏览器的地址栏输入,比如说http://abc.def.localhost:8000/并按下回车键时,它会返回abc.def.localhost

from fastapi import FastAPI, Request
import urllib


app = FastAPI()


@app.get('/')
def index(request: Request):
    url = urllib.parse.urlparse(str(request.url))
    return url.hostname

你还可以进一步使用split这个方法来拆分hostname,用.)作为分隔符,这样就能得到子域名。使用之前提到的URL,下面的例子会返回["abc","def"]。示例:

@app.get('/')
def index(request: Request):
    url = urllib.parse.urlparse(str(request.url))
    subs = url.hostname.split('.')
    return subs[:-1]

更新

其实不一定要用urllib.parse.urlparse()来获取hostname,你也可以直接使用request.url.hostname。因此,更新后的例子看起来是这样的:

from fastapi import FastAPI, Request


app = FastAPI()


@app.get('/')
def index(request: Request):
    subs = request.url.hostname.split('.')
    return subs[:-1]

注意,如果hostname不是abc.def.localhost,而是比如说abc.def.example.com,那么在上面的例子中,你需要使用subs[:-2]来排除顶级域和第二级域名(也就是comexample)从子域名列表中。

撰写回答