Flask - 无法请求位于子域的特定端点
Flask - Trouble Requesting Specific Endpoint that lies at a Subdomain
所以.. 再次回到另一个烧瓶问题:
我的应用程序主要围绕对各个部分使用子域而不是前缀进行设置。因此,我的应用程序的典型 url 如下所示:
domain.tld/
domain.tld/about
admin.domain.tld/
admin.domain.tld/login
etc.
我正在编写单元测试,我似乎 运行 遇到了问题。我已经对 Flask 和 Werkzeug 文档进行了大量搜索,但我似乎无法弄清楚如何解决我的问题。
基本上,当我进行测试时,我试图模拟对各种 url 的 GET
请求.. 并且其中很多 URL 都将落在子域上。我尝试了以下似乎合乎逻辑的方法:
with app.app_context():
url = url_for("admin.login") # returns http://admin.domain.tld:80/login
with app.test_client() as c:
resp = c.get(url) # Fails: returns 404
assert resp.data == "Expected test response", "Bad Response"
现在.. 我的 c.get
应该 return 包含 url 处的预期数据的响应,但我得到的是默认的 404 处理程序。这使得我很难测试我的许多路线。
我对 Flask 做了一些阅读,发现 a github issue 注意到测试客户端需要一个亲戚 url... 好吧..我不确定如何提供它,因为我需要指定子域。
此外,我进一步阅读并发现 Flask 测试客户端是在 Werkzeug 测试客户端上构建的,而 Werkzeug 测试客户端包含一个通常为 false 的 "allow_subdomain_redirects" 选项。可悲的是,到目前为止,尝试将我的 Flask 测试客户端配置为具有该行为失败了(我可能做错了)。
无论如何,有谁知道我如何在我的烧瓶应用程序中模拟一个请求并定位一个子域?此刻,我完全没有想法。感谢您的任何建议。 :)
所以..经过大量调试我发现了问题...毕竟这似乎是 Flask 的问题,虽然不是我上面链接的问题。
首先,经过大量搜索后,我发现 this archive here 似乎提供了有关如何正确发出子域请求的指导:
with app.test_client() as c:
c.get("/target/path.html", base_url="admin.domain.tld/")
有一个警告,但是...根据 app.config["SERVER_NAME"]
的设置,此 可能不起作用... 具体来说,从 flask 0.11.1 开始如果 app.config["SERVER_NAME"]
有一个明确的 80 端口,上面的 c.get
将 FAIL。 (即如果 SERVER_NAME
看起来像 domain.tld:80
)但是..如果 SERVER_NAME
包含任何其他端口它将正常运行。 (即如果 SERVER_NAME
看起来像 domain.tld:5000
一切都会正常)
我不知道这是不是故意的..但它让我很头疼,也很忙..我很快就会在上面发布一个 github issue 以确保确实是有意的。
所以.. 再次回到另一个烧瓶问题:
我的应用程序主要围绕对各个部分使用子域而不是前缀进行设置。因此,我的应用程序的典型 url 如下所示:
domain.tld/
domain.tld/about
admin.domain.tld/
admin.domain.tld/login
etc.
我正在编写单元测试,我似乎 运行 遇到了问题。我已经对 Flask 和 Werkzeug 文档进行了大量搜索,但我似乎无法弄清楚如何解决我的问题。
基本上,当我进行测试时,我试图模拟对各种 url 的 GET
请求.. 并且其中很多 URL 都将落在子域上。我尝试了以下似乎合乎逻辑的方法:
with app.app_context():
url = url_for("admin.login") # returns http://admin.domain.tld:80/login
with app.test_client() as c:
resp = c.get(url) # Fails: returns 404
assert resp.data == "Expected test response", "Bad Response"
现在.. 我的 c.get
应该 return 包含 url 处的预期数据的响应,但我得到的是默认的 404 处理程序。这使得我很难测试我的许多路线。
我对 Flask 做了一些阅读,发现 a github issue 注意到测试客户端需要一个亲戚 url... 好吧..我不确定如何提供它,因为我需要指定子域。
此外,我进一步阅读并发现 Flask 测试客户端是在 Werkzeug 测试客户端上构建的,而 Werkzeug 测试客户端包含一个通常为 false 的 "allow_subdomain_redirects" 选项。可悲的是,到目前为止,尝试将我的 Flask 测试客户端配置为具有该行为失败了(我可能做错了)。
无论如何,有谁知道我如何在我的烧瓶应用程序中模拟一个请求并定位一个子域?此刻,我完全没有想法。感谢您的任何建议。 :)
所以..经过大量调试我发现了问题...毕竟这似乎是 Flask 的问题,虽然不是我上面链接的问题。
首先,经过大量搜索后,我发现 this archive here 似乎提供了有关如何正确发出子域请求的指导:
with app.test_client() as c:
c.get("/target/path.html", base_url="admin.domain.tld/")
有一个警告,但是...根据 app.config["SERVER_NAME"]
的设置,此 可能不起作用... 具体来说,从 flask 0.11.1 开始如果 app.config["SERVER_NAME"]
有一个明确的 80 端口,上面的 c.get
将 FAIL。 (即如果 SERVER_NAME
看起来像 domain.tld:80
)但是..如果 SERVER_NAME
包含任何其他端口它将正常运行。 (即如果 SERVER_NAME
看起来像 domain.tld:5000
一切都会正常)
我不知道这是不是故意的..但它让我很头疼,也很忙..我很快就会在上面发布一个 github issue 以确保确实是有意的。