clé secrète pas un flacon de la session, avec le Flacon Session extension
Maintenant je suis à l'aide d'un flacon 3ème partie de la bibliothèque de En Flacon De Session et je vais avoir pas de chance pour une session de travail.
Lorsque je me connecte à mon site, j'obtiens l'erreur suivante:
RuntimeError: la session n'est pas disponible car aucune clé secrète a été
ensemble. Définir la secret_key sur l'application de quelque chose d'unique et
secret.
Ci-dessous mon code 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 __name__ == "__main__":
app.secret_key = 'super secret key'
sess.init_app(app)
app.debug = True
app.run()
Comme vous pouvez le voir, j'ai placé l'application de la clé secrète. Ce que je fais mal?
Il existe d'autres options de session?
Autres infos:
L'exécution de Python 2.7 sur Linux Mint
Pleine pâ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.
- Qu'est-ce que la pleine traçabilité en amont de l'exception?
- Et quelle est la version de
Flask-Session
utilisez-vous? Je ne trouve aucune référence de cette exception dans le projet en cours source. - Une idée de comment je pourrais le savoir? J'ai juste fait un pip install pour elle
- Trouvé le message de l'exception déjà; c'est dans le Flacon lui-même, pas en Flacon de Session.
- J'ai ajouté plein de sperme. Il s'affiche lorsque je tente de définir la 'userId' clé, comme vous pouvez le voir
Vous devez vous connecter pour publier un commentaire.
Dans votre cas, l'exception est soulevée par le
NullSessionInterface
session de mise en œuvre, qui est la de session par défaut de type lorsque vous utilisez la Fiole de Session. C'est parce que vous n'avez pas jamais réellement donner leSESSION_TYPE
configuration pour Flacon; il est pas assez pour la définir comme un global dans votre module. Le En flacon de Session de démarrage rapide exemple de code ne mettre un mondial, mais utilise ensuite le module courant comme un objet de configuration en appelantapp.config.from_object(__name__)
.Ce défaut n'a pas beaucoup de sens avec Flacon de 0,10 ou plus récent;
NullSession
logique avec Flacon de 0,8 ou 0,9, mais dans la version actuelle de lafiole.session.NullSession
de la classe est utilisé comme un signal d'erreur. Dans votre cas, il vous donne le message d'erreur incorrect maintenant.Définir la
SESSION_TYPE
option de configuration à autre chose. Choisissez l'un desredis
,memcached
,filesystem
oumongodb
, et assurez-vous de le mettre enapp.config
(directement ou par l'intermédiaire de la diversConfig.from_*
méthodes).Pour un test rapide, la valeur
filesystem
est la plus facile; il y a assez de configuration par défaut il y a que le travail sans dépendances supplémentaires:Si vous voyez ce message d'erreur et vous êtes pas l'aide en Flacon de Session, puis quelque chose s'est mal passé avec réglage du secret. Si vous êtes mise en
app.config['SECRET_KEY']
ouapp.secret_key
dans unif __name__ == "__main__":
garde comme ci-dessus et vous obtenez cette erreur, alors vous êtes probablement l'exécution de votre ballon d'application par l'intermédiaire d'un serveur WSGI que les importations votre ballon projet comme un module, et la__name__ == "__main__"
bloc n'est jamais exécuté.Il est toujours préférable de gestion de la configuration pour Flacon applications dans un fichier séparé, de toute façon.
app.secret_key
est une mauvaise pratique. Mieux définir le secret de la clé par le biais de laapp.config
objet, qui permet de décharger la configuration dans un fichier externe.app.secret_key = ...
de la si bloc – qui, avec le recul du sens depuis Heroku s'exécute l'application via gunicorn, ce qui signifie que leif __name__ == "__main__":
bloc n'est jamais entré.Définir la clé secrète à l'extérieur de
if __name__ == '__main__':
app.py:
Lorsque vous démarrez votre application en cours d'exécution
flask run
laif __name__ == '__main__':
bloc est sautée. Si vous ne voulez pas sauter, il faut l'exécuter avecpython app.py
.Essayez ceci:
Et supprimer votre
app.secret_key
assignation au fond.