2013-05-13 9 views
12

Ich teste eine Flask-Anwendung (Flask 0.9), und insbesondere habe ich eine Sitzung Leuchte, die ich in der dokumentierten Weise ausführen möchte, in etwa so (ich bin der Begegnung ist ein unerwartetes Ergebnis, wo die Sitzungsdaten nicht in der Endpunkt gesetztUnit-Test eine Flask-Sitzung - kann Fehler nicht mit Session_Transaction reproduzieren

ERROR:root:<SecureCookieSession {'x': 1}> 

Leider: wie ich es verstehe):

from flask import Flask, session 
app = Flask(__name__) 

@app.route('/', methods=['POST']) 
def m(): 
    logging.error(session) # expect {'x': 1} 
    return "" 

with app.test_request_context() as trc: 
    with app.test_client() as c: 
    with c.session_transaction() as sess: 
     sess['x'] = 1 
    c.post() 

Dies funktioniert wie erwartet, wobei der Ausgang ist so etwas wie dieses Funktion, dh die Ausgabe ist etwa so:

ERROR:root:<SecureCookieSession {}> 

Dieses Problem tritt nur auf, wenn es von meinem Unit-Test-Framework ausgeführt wird. Wie es aussieht, kann ich dieses Problem nicht mit einem degenerierten Fall reproduzieren, obwohl ich eine ziemlich erhebliche Anstrengung unternommen habe with a gist of some of this effort here. Der springende Punkt ist, dass ich itsdangerous und Google App Engine testbed eingeschlossen habe, in der Erwartung, dass einer von ihnen die Ursache war.

Auf meinem eigenen System bin ich weiter gegangen als die gist, und fast vollständig repliziert meine Unit-Test-Framework versucht, dies zu isolieren. Ebenso habe ich immer größere Mengen an relevantem Code aus meinem Test-Framework entfernt. Auf den Punkt bin ich nicht in der Lage, an Unterschiede zwischen dem entarteten Fall und meinem abgespeckten Rahmen zu denken, der das Ergebnis beeinflussen könnte. Ich habe den c.post() Aufruf in pdb durchlaufen, um zu versuchen, die Ursache dieser Malignität herauszufinden, aber habe noch irgendwelche nützlichen Einblicke zu gewinnen.

Was alles zu sagen ist, wäre ich dankbar für eine kleine Richtung oder einen Vorschlag, wo das Problem liegen könnte. Was könnte den Werkzeug Kontext so beeinflussen, dass die nicht geehrt wird?

+0

Ich weiß, dass es ein Jahr ist, aber ich stoße selbst auf dieses Problem. Konntest du das jemals herausfinden? Laut was ich online und in der Dokumentation gelesen habe, sollte dies perfekt funktionieren. Aber das tut es nicht. –

+0

@IanHunter Schauen Sie sich meine Antwort unten an. Es könnte helfen. –

Antwort

0

Hier ist, was ich am Ende tun:

# Code that modifies the current `session`; we must be in a test context already. 
headers = {} 
with self.client.session_transaction(): 
    # Get the cookie that is sent to the browser to establish a connection 
    # via a fake request. 
    response = make_response() 
    self.app.session_interface.save_session(self.app, session, response) 
    headers['Cookie'] = response.headers.get('Set-Cookie', '') 
self.client.post(..., headers=headers) # also works for .get, .put, etc. 
0

Ohne einen Testfall, der tatsächlich fehlschlägt, ist es schwer, viel zu sagen. Ich kann nur daran denken, dass die TestClient Instanz, die Sie verwenden, um die Anforderung zu stellen, sich von der unterscheidet, die Sie zum Einrichten der Sitzung verwenden. Z.B. Sie könnte der Kern machen scheitern wie dies zu erwarten:

with self.app.test_client() as c: 
    with c.session_transaction() as sess: 
     sess['d'] = 1 
    self.client.post() 

Aber da dies hier nicht der Fall ist oder der Kern, Figur gehen.

+0

Danke. Ich habe ein wenig Schwierigkeiten zu verstehen, was Sie hier hinzufügen wollen, Tommi. Wenn Sie bemerken, dass das Problem hart ist, stimme ich sicherlich zu - daher die Prämie! ;) –

+1

Wie ich es sehe ist der Hauptgrund, dass es schwer ist, dass der Code, den du gepostet hast * nicht wie beschrieben fehlschlägt *. Wenn ich also mit dem Arbeitscode fertig bin, kann ich nur eine fundierte Vermutung dafür treffen, wie man es scheitern lässt, wie du es beschrieben hast, und die Probe, die ich gepostet habe, scheint genauso gut zu sein wie jede andere. Tu das einfach nicht im richtigen Code und du solltest näher daran sein, etwas zum Laufen zu bringen. –

3

In meinem Fall beschränkte ich Cookies automatisch auf eine bestimmte Domäne durch Laden einer Konfigurationsdatei. Durch die Aktualisierung der Konfiguration konnte ich während des Komponententests Cookies erhalten. Wenn Sie die Eigenschaft SESSION_COOKIE_DOMAIN auf None setzen, konnten alle Domänen (nämlich localhost) Sitzungen einrichten.

app.config.update(              
    SESSION_COOKIE_DOMAIN = None             
) 

Möglicherweise möchten Sie mit den Konfigurationseinstellungen unter Configuration Handling in der Dokumentation beschrieben herumzudaddeln.

1

Ich hasse eine alte Frage wieder zu beleben, aber ich glaube, dass ich die Lösung für dieses Problem herausgefunden. Für die Prüfung, versuchen Sie den Servernamen localhost Einstellung:

app.config['SERVER_NAME'] = 'localhost' 

Ich war ursprünglich Brian Hack, aber das Problem für mich gelöst.

Verwandte Themen