2016-07-27 24 views
0

Ich möchte Sitzungsdaten vom Flask-Teil an den Websocket-Teil meiner App senden. Ein vereinfachtes Beispiel ist:Flasch an Autobahn und verdreht: RuntimeError: Arbeit außerhalb des Anfragekontexts

from flask import session 

class EchoServerProtocol(WebSocketServerProtocol): 
    def __init__(self): 
     self.user= session.get('user') 

    def onMessage(self, payload, isBinary): 
     _user=self.user 

     self.sendMessage(payload, isBinary, _user) 

app = Flask(__name__) 

app.secret_key = str(uuid.uuid4()) 

@app.route('/') 
def page_home(): 
    return render_template('index.html') 

(adaptiert von here).

erhielt ich den Fehler:

File "app.py", line 171, in __init__ 
    if session.get('user'): 
    File "/usr/local/lib/python2.7/dist-packages/werkzeug/local.py", line 338, in __getattr__ 
    return getattr(self._get_current_object(), name) 
    File "/usr/local/lib/python2.7/dist-packages/werkzeug/local.py", line 297, in _get_current_object 
    return self.__local() 
    File "/usr/local/lib/python2.7/dist-packages/flask/globals.py", line 20, in _lookup_req_object 
    raise RuntimeError('working outside of request context') 
exceptions.RuntimeError: working outside of request context 
+0

Ich bin nicht vertraut mit Autobahn, aber das Flask 'session' Objekt ist etwas magisch und ist nur verfügbar, wenn * Flask * eine Anfrage bearbeitet (oder wenn ein Flask-Anfrage-Kontext aktiv ist). In dem Code, den Sie verlinkt haben, behandelt Autobahn die Web-Sockets separat von Flask, das die regulären Anfragen bearbeitet. Sie könnten Flask-Sockets oder Flask-SocketIO verwenden, um Flask auf die Web-Sockets aufmerksam zu machen. – matts

+0

In dem veröffentlichten Beispiel wird das EchoServerProtocol über index.html erreicht, daher ist es nicht vollständig getrennt. – Mostafa

+0

Das Ergebnis des Renderings von 'index.html' wird clientseitig ausgeführt, nicht in einem Anforderungskontext auf der Serverseite. – davidism

Antwort

0

Die vorübergehende Lösung war ich fand den Benutzername als Beize Objekt im Flask Teil zu speichern, und die Gurke Objekt im websocket Teil zu laden, wie:

+0

Huch! Was ist die Leistungseinbuße bei diesem Ansatz? –

+0

Ich weiß nicht, ich habe meistens Angst, dass dieser Ansatz nicht auf einen Server mit vielen Benutzern skalieren wird. Ich benutze eine einzige Datei 'userfile.p' für alle, in der Hoffnung, dass 2 verschiedene Benutzer nicht gleichzeitig auf die selbe Datei zugreifen. – Mostafa

+0

Haben Sie Klein oder Tornado in Betracht gezogen? Mit Klein können Sie sehr einfach Autobahn benutzen und Tornado hat auch ein einfaches Web-Socket-Modul. Wie Sie wissen, macht Flask hinter den Kulissen eine Menge Magie, was es manchmal schwierig macht, Programme zu programmieren. –