Im Moment verwende ich eine Flask-Session einer Drittanbieter-Bibliothek und habe kein Glück, dass eine Sitzung 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 etwas Einzigartiges und Geheimes.
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 __name__ == "__main__":
app.secret_key = 'super secret key'
sess.init_app(app)
app.debug = True
app.run()
Wie Sie sehen können, setze ich den geheimen Schlüssel der App. Was mache ich falsch?
Gibt es andere Sitzungsoptionen?
Weitere Informationen: Ausführen von Python 2.7 unter Linux Mint
Vollpaste:
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.
Flask-Session
Sie? Ich kann in der aktuellen Projektquelle keinen Hinweis auf diese Ausnahme finden .Antworten:
In Ihrem Fall wird die Ausnahme von der
NullSessionInterface
Sitzungsimplementierung ausgelöst. Dies ist der Standard-Sitzungstyp, wenn Sie Flask-Session verwenden. Das liegt daran, dass Sie Flask dieSESSION_TYPE
Konfiguration nie wirklich geben . Es reicht nicht aus , es in Ihrem Modul als global festzulegen. Der Flask-Session-Schnellstart-Beispielcode legt zwar einen globalen Wert fest , verwendet dann jedoch das aktuelle Modul durch Aufrufen als Konfigurationsobjekt .app.config.from_object(__name__)
Diese Standardeinstellung ist bei Flask 0.10 oder neuer nicht sehr sinnvoll.
NullSession
mag mit Flask 0.8 oder 0.9 sinnvoll gewesen sein, aber in der aktuellen Version wird dieflask.session.NullSession
Klasse als Fehlersignal verwendet. In Ihrem Fall erhalten Sie jetzt die falsche Fehlermeldung.Stellen Sie die
SESSION_TYPE
Konfigurationsoption auf etwas anderes ein. Wählen Sie eine vonredis
,memcached
,filesystem
odermongodb
, und stellen Sie sicher , dass es setzen inapp.config
(direkt oder über die verschiedenenConfig.from_*
Methoden ).Für einen schnellen Test ist es am
filesystem
einfachsten , ihn einzustellen. Es gibt dort genug Standardkonfiguration, damit dies ohne zusätzliche Abhängigkeiten funktioniert:if __name__ == "__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 Einstellen des Geheimnisses ein Fehler aufgetreten. Wenn Sie eine Wache wie oben einstellen
app.config['SECRET_KEY']
oder diese Fehlermeldung erhalten, wird Ihre Flask-App wahrscheinlich über einen WSGI-Server ausgeführt, der Ihr Flask-Projekt als Modul importiert , und der Block wird nie ausgeführt.app.secret_key
if __name__ == "__main__":
__name__ == "__main__"
Es ist sowieso immer besser, die Konfiguration für Flask-Apps in einer separaten Datei zu verwalten .
quelle
app.secret_key
eine schlechte Praxis ist. Es ist besser, einen geheimen Schlüssel über dasapp.config
Objekt festzulegen, damit Sie die Konfiguration in eine externe Datei auslagern können.app.secret_key = ...
aus dem if- Block herausgezogen bin - was im Nachhinein sinnvoll ist, da Heroku die App über Gunicorn ausführt, was bedeutet, dass derif __name__ == "__main__":
Block nie eingegeben wird.flask_session
und die Standardsammlung wird aufgerufensessions
.Setzen Sie den geheimen Schlüssel außerhalb von
if __name__ == '__main__':
app.py:
from flask import Flask, session app = Flask(__name__) app.secret_key = "super secret key" @app.route("/") ... if __name__ == '__main__': app.debug = True app.run()
Wenn Sie Ihre App durch Ausführen starten, wird
flask run
derif __name__ == '__main__':
Block übersprungen. Wenn Sie es nicht überspringen möchten, führen Sie es aus mitpython app.py
.quelle
Versuche dies:
app = Flask(__name__) app.config['SESSION_TYPE'] = 'memcached' app.config['SECRET_KEY'] = 'super secret key' sess = Session()
Und entfernen Sie Ihre
app.secret_key
Aufgabe unten.quelle