2016-07-14 15 views
2

So .. Wieder zurück mit einer anderen Kolben Frage:Flask - Fehler Anfordern bestimmter Endpunkt, der bei einer Sub-Domäne liegt

Meine Anwendung ist weitgehend um die Verwendung von Sub-Domains für verschiedene Teile anstelle von Präfixen einrichten. Als solche typische Urls für meine app wie folgt aussehen:

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

Ich Komponieren Unit-Tests und ich habe scheinen in ein Problem zu laufen. Ich habe die Flask- und Werkzeug-Dokumentation gründlich durchforstet, aber ich kann nicht herausfinden, wie ich mein Problem beheben kann.

Grundsätzlich, wenn ich versuche, versuche ich eine GET Anfrage an verschiedene URLs zu simulieren .. und viele dieser URLs fallen auf Subdomains. Ich habe die folgende versucht, die logisch zu sein scheint:

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" 

Jetzt .. mein c.get soll eine Antwort zurückgeben erwartete Daten an der URL enthält, sondern stattdessen den Standard-404-Handler Ich werde gegeben. Das macht es ziemlich schwer, viele meiner Routen zu testen.

Ich habe etwas in Flask gelesen und gefunden a github issue, dass der Test-Client erwartet eine relative URL ... naja .. Ich bin nicht sicher, wie ich das zur Verfügung stellen, da ich die Sub-Domain angeben muss.

Außerdem habe ich weiter gelesen und festgestellt, dass der Flask-Test-Client auf dem Werkzeug-Test-Client aufgebaut ist und der Werkzeug-Test-Client eine Option für "allow_subdomain_redirects" enthält, die normalerweise falsch ist. Leider ist der Versuch, meinen Flask-Test-Client so zu konfigurieren, dass er dieses Verhalten hat, fehlgeschlagen (ich könnte es falsch machen).

Wie auch immer, weiß jemand, wie ich eine Anfrage in meiner Kolben-App simulieren und eine Subdomain anvisieren kann? Im Moment habe ich keine Ideen mehr. Danke für Anregungen. :)

Antwort

2

Also .. Nach einer Menge Debugging habe ich das Problem gefunden ... und es scheint ein Flask-Problem nach allem zu sein, obwohl nicht die eine, die ich oben verlinkt.

Zuerst nach LOTS des Suchens ich this archive here gefunden, die Hinweise zu geben schien wie für Subdomains richtig die Anfrage zu machen:

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

Es gibt eine Einschränkung ist, aber ... auf was app.config["SERVER_NAME"] Je gesetzt zu diesem möglicherweise nicht funktioniert ... Konkret, wie von Kolben 0.11.1 wenn app.config["SERVER_NAME"] hat einen expliziten Port von 80 die obigen c.get wird FAIL. (d. h. wenn SERVER_NAME wie domain.tld:80 aussieht) Wenn jedoch SERVER_NAME einen anderen Anschluss enthält, funktioniert es ordnungsgemäß. (dh wenn SERVER_NAME aussieht wie domain.tld:5000 alles wird gut funktionieren)

Ich weiß nicht, ob dies beabsichtigt ist oder nicht .. aber es hat mir eine Menge Kopfschmerzen verursacht und Arbeit .. Ich werde eine Github Problem veröffentlichen darauf kurz, nur um sicherzustellen, dass es in der Tat beabsichtigt ist.

+0

[Github Issue.] (Https://github.com/pallets/flask/issues/1955) [Gist demonstrierendes Problem.] (Https://gist.github.com/CorneliaXaos/9e4fa46f442f72fc5bff07ffedace397) –