webentwicklung-frage-antwort-db.com.de

Der geheime Schlüssel wurde in der Sitzung flask mit der Erweiterung Flask-Session nicht festgelegt

Im Moment benutze ich eine flask 3rd Party Library Flask-Session und ich habe kein Glück, dass eine Session funktioniert.

Wenn ich eine Verbindung zu meiner Site herstelle, wird folgende Fehlermeldung angezeigt:

RuntimeError: Die Sitzung ist nicht verfügbar, da kein geheimer Schlüssel festgelegt wurde. Setzen Sie den secret_key in der Anwendung auf einen eindeutigen und geheimen Wert.

Unten ist mein Servercode.

from flask import Flask, session
from flask.ext.session import Session

SESSION_TYPE = 'memcache'

app = Flask(__name__)
sess = Session()

nextId = 0

def verifySessionId():
    global nextId

    if not 'userId' in session:
        session['userId'] = nextId
        nextId += 1
        sessionId = session['userId']
        print ("set userid[" + str(session['userId']) + "]")
    else:
        print ("using already set userid[" + str(session['userId']) + "]")
    sessionId = session.get('userId', None)
    return sessionId

@app.route("/")
def hello():
    userId = verifySessionId()
    print("User id[" + str(userId) + "]")
    return str(userId)

if __== "__main__":
    app.secret_key = 'super secret key'

    sess.init_app(app)

    app.debug = True
    app.run()

Wie Sie sehen, habe ich den geheimen Schlüssel der App festgelegt. Was mache ich falsch?

Gibt es andere Sitzungsoptionen?

Weitere Informationen: Ausführen von Python 2.7 unter Linux Mint

Volle Paste:

Traceback (most recent call last):
  File "/home/sean/code/misc/hangman/venv/lib/python2.7/site-packages/flask/app.py", line 1836, in __call__
    return self.wsgi_app(environ, start_response)
  File "/home/sean/code/misc/hangman/venv/lib/python2.7/site-packages/flask/app.py", line 1820, in wsgi_app
    response = self.make_response(self.handle_exception(e))
  File "/home/sean/code/misc/hangman/venv/lib/python2.7/site-packages/flask/app.py", line 1403, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/home/sean/code/misc/hangman/venv/lib/python2.7/site-packages/flask/app.py", line 1817, in wsgi_app
    response = self.full_dispatch_request()
  File "/home/sean/code/misc/hangman/venv/lib/python2.7/site-packages/flask/app.py", line 1477, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/home/sean/code/misc/hangman/venv/lib/python2.7/site-packages/flask/app.py", line 1381, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/home/sean/code/misc/hangman/venv/lib/python2.7/site-packages/flask/app.py", line 1475, in full_dispatch_request
    rv = self.dispatch_request()
  File "/home/sean/code/misc/hangman/venv/lib/python2.7/site-packages/flask/app.py", line 1461, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/sean/code/misc/session/sessiontest.py", line 27, in hello
    userId = verifySessionId()
  File "/home/sean/code/misc/session/sessiontest.py", line 16, in verifySessionId
    session['userId'] = nextId
  File "/home/sean/code/misc/hangman/venv/lib/python2.7/site-packages/werkzeug/local.py", line 341, in __setitem__
    self._get_current_object()[key] = value
  File "/home/sean/code/misc/hangman/venv/lib/python2.7/site-packages/flask/sessions.py", line 126, in _fail
    raise RuntimeError('the session is unavailable because no secret '
RuntimeError: the session is unavailable because no secret key was set.  Set the secret_key on the application to something unique and secret.
65
MintyAnt

In Ihrem Fall wird die Ausnahme durch die NullSessionInterface-Sitzungsimplementierung ausgelöst. Dies ist der Standardsitzungstyp, wenn Sie Flask-Session verwenden. Das liegt daran, dass Sie die SESSION_TYPE - Konfiguration nie tatsächlich angegeben haben to Flask; Es ist nicht genug, um es in Ihrem Modul als global festzulegen. Der Flask-Session-Schnellstart-Beispielcode setzt ein globales, verwendet dann aber das aktuelle Modul als Konfigurationsobjekt, indem er app.config.from_object(__name__) aufruft.

Diese Voreinstellung ist mit Flask 0.10 oder neuer nicht sinnvoll; NullSession mag mit Flask 0.8 oder 0.9 sinnvoll gewesen sein, aber in In der aktuellen Version wird die Klasse flask.session.NullSession als Fehlersignal verwendet, in Ihrem Fall wird jetzt die falsche Fehlermeldung ausgegeben.

Setzen Sie die Konfigurationsoption SESSION_TYPE Auf einen anderen Wert. Wählen Sie eines von redis, memcached, filesystem oder mongodb und stellen Sie sicher, dass Sie es in app.config Einstellen (direkt oder über - verschiedene Config.from_* Methoden ).

Für einen schnellen Test ist es am einfachsten, ihn auf filesystem zu setzen. Es gibt genügend Standardkonfigurationen, damit dies ohne zusätzliche Abhängigkeiten funktioniert:

if __== "__main__":
    app.secret_key = 'super secret key'
    app.config['SESSION_TYPE'] = 'filesystem'

    sess.init_app(app)

    app.debug = True
    app.run()

Wenn Sie diesen Fehler sehen und Flask-Session nicht verwenden , ist beim Festlegen des Geheimnisses ein Fehler aufgetreten. Wenn Sie app.config['SECRET_KEY'] Oder app.secret_key In einem if __== "__main__": - Schutz wie oben festgelegt haben und diese Fehlermeldung angezeigt wird, führen Sie wahrscheinlich Flask aus App über einen WSGI-Server, der Ihr Flask project als Modul importiert, und der Block __== "__main__" wird niemals ausgeführt.

Es ist sowieso immer besser, Konfiguration für Flask apps in einer separaten Datei zu verwalten.

69
Martijn Pieters

Setzen Sie den geheimen Schlüssel außerhalb von if __== '__main__':

app.py:

from flask import Flask, session

app = Flask(__name__)
app.secret_key = "super secret key"

@app.route("/")
...

if __== '__main__':
    app.debug = True
    app.run()

Wenn Sie Ihre App mit flask run Starten, wird der Block if __== '__main__': Übersprungen. Wenn Sie es nicht überspringen möchten, führen Sie es mit python app.py Aus.

48
hayden

Versuche dies:

app = Flask(__name__)
app.config['SESSION_TYPE'] = 'memcached'
app.config['SECRET_KEY'] = 'super secret key'
sess = Session()

Und entferne dein app.secret_key Zuordnung unten.

10
Miguel