web-dev-qa-db-fra.com

clé secrète non définie dans flask session, en utilisant l'extension Flask-Session

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.
65
MintyAnt

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.

69
Martijn Pieters

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.

48
hayden

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.

10
Miguel