En ce moment, j'utilise une flask bibliothèque tierce partie Flask-Session et je n'ai pas de chance de faire fonctionner une session.
Lorsque je me connecte à mon site, le message d'erreur suivant s'affiche:
RuntimeError: la session n'est pas disponible car aucune clé secrète n'a été définie. Définissez la clé secret_key de l'application sur quelque chose d'unique et de secret.
Ci-dessous, le code de mon serveur.
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()
Comme vous pouvez le constater, je règle la clé secrète de l'application. Qu'est-ce que je fais mal?
Existe-t-il d'autres options de session?
Autres infos: en cours d’exécution Python 2.7 sous Linux Mint
Pâte complète:
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.
Dans votre cas, l'exception est déclenchée par l'implémentation de session NullSessionInterface
, qui correspond au type de session par défaut lorsque vous utilisez Flask-Session. En effet, vous ne donnez jamais la configuration SESSION_TYPE
à Flask; c'est pas assez pour le définir en tant que global dans votre module. Le exemple de code de démarrage rapide Flask-Session définit un paramètre global, mais utilise ensuite le module actuel en tant qu'objet de configuration en appelant app.config.from_object(__name__)
.
Ce paramètre par défaut n'a pas beaucoup de sens avec Flask 0.10 ou plus récent; NullSession
peut avoir eu un sens avec Flask 0.8 ou 0.9, mais dans La version actuelle de la classe flask.session.NullSession
est utilisée comme signal d'erreur. Dans votre cas, cela vous donne maintenant le mauvais message d'erreur.
Définissez l'option de configuration SESSION_TYPE
Sur quelque chose d'autre. Choisissez l’un des redis
, memcached
, filesystem
ou mongodb
, et assurez-vous de le définir dans app.config
(Directement ou via le - différentes méthodes Config.from_*
).
Pour un test rapide, le régler sur filesystem
est le plus simple; il y a suffisamment de configuration par défaut pour que cela fonctionne sans dépendances supplémentaires:
if __== "__main__":
app.secret_key = 'super secret key'
app.config['SESSION_TYPE'] = 'filesystem'
sess.init_app(app)
app.debug = True
app.run()
Si vous voyez cette erreur et que vous utilisez pas avec Flask-Session, il y a un problème avec la définition du secret. Si vous définissez app.config['SECRET_KEY']
Ou app.secret_key
Dans un if __== "__main__":
Comme ci-dessus et que vous obtenez cette erreur, vous exécutez probablement votre Flask application via un serveur WSGI qui importe votre Flask projet sous forme de module, et le bloc __== "__main__"
n'est jamais exécuté.
Il est toujours préférable de gérer la configuration pour Flask applications dans un fichier séparé , de toute façon.
Définir la clé secrète en dehors de 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()
Lorsque vous démarrez votre application en exécutant flask run
le if __== '__main__':
bloc est ignoré. Si vous ne voulez pas le sauter, lancez avec python app.py
.
Essaye ça:
app = Flask(__name__)
app.config['SESSION_TYPE'] = 'memcached'
app.config['SECRET_KEY'] = 'super secret key'
sess = Session()
Et retirez votre app.secret_key
affectation en bas.