如何在FastAPI中解析URL中的子域名?
我们的客户将会访问我们新的API,地址是 foo123.bar456.domain.com/v1.5/
这里的 foo123
和 bar456
是特定账户的子域名(这也帮助我们进行负载均衡)。它们表示一些关系,并触发我们需要处理的操作。
我们不想在网址中反复传递查询参数,比如 ....domain.com/v1.5/?acc=foo123&parent=bar456
,因为这样做其实不太符合Python的风格。
所以,我想在FastAPI中解析被调用的完整域名。
我找不到关于如何进行这种网址解析的建议,尤其是那些不涉及域名右侧文件夹的。有没有什么建议或提示?谢谢!
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]
来排除顶级域和第二级域名(也就是com
和example
)从子域名列表中。