Flask - 麻烦请求位于子域

时间:2016-07-14 00:49:06

标签: python-3.x flask werkzeug

所以......又回到另一个烧瓶问题:

我的应用程序主要围绕使用子域而不是前缀来设置各个部分。因此,我的应用程序的典型网址如下所示:

domain.tld/
domain.tld/about
admin.domain.tld/
admin.domain.tld/login
etc.

我正在编写单元测试,我似乎遇到了问题。我已经对Flask和Werkzeug文档进行了大量搜索,但我似乎无法弄清楚如何解决我的问题。

基本上,当我在测试时,我正在尝试模拟对各个网址的GET请求..而且很多这些网址都会落在子域名上。我尝试过以下看似合乎逻辑的内容:

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应该在网址上返回包含预期数据的响应,但我将获得默认的404处理程序。这使我很难测试我的许多路线。

我已经对Flask进行了一些阅读,发现a github issue注意到测试客户端需要一个相对网址...好吧..我不知道如何提供,因为我需要指定子域名

此外,我进一步阅读并发现Flask测试客户端是在Werkzeug测试客户端上构建的,而Werkzeug测试客户端包含一个通常为false的“allow_subdomain_redirects”选项。遗憾的是,尝试配置我的Flask测试客户端到目前为止这种行为失败了(我可能做错了)。

无论如何,有谁知道如何在我的烧瓶应用程序中模拟请求并定位子域?目前,我完全没有想法。谢谢你的任何建议。 :)

1 个答案:

答案 0 :(得分:2)

所以..经过大量调试后我发现了问题......毕竟它似乎是一个Flask问题,虽然不是我上面链接的问题。

首先,经过大量搜索后,我发现this archive here似乎就如何正确提出子域请求提供了指导:

with app.test_client() as c:
    c.get("/target/path.html", base_url="admin.domain.tld/")

但需要注意的是......根据app.config["SERVER_NAME"]设置的内容,可能无法正常工作...... 具体来说,如果{{1},则为烧瓶0.11.1有一个显式端口80以上app.config["SERVER_NAME"]失败。 (即如果c.get看起来像SERVER_NAME)但是..如果domain.tld:80包含任何其他端口,它将正常运行。 (即如果SERVER_NAME看起来像SERVER_NAME,一切都会正常工作)

我不知道这是否有意......但它让我很头疼并且工作......我很快就会发布一个github问题,以确保它是确实有意。