En este momento estoy usando un matraz de biblioteca de terceros Flask-Session y no tengo suerte para que una sesión funcione.
Cuando me conecto a mi sitio, aparece el siguiente error:
RuntimeError: la sesión no está disponible porque no se estableció una clave secreta. Establezca la clave_secreta de la aplicación en algo único y secreto.
A continuación se muestra el código de mi servidor.
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()
Como puede ver, configuro la clave secreta de la aplicación. ¿Qué estoy haciendo mal?
¿Hay otras opciones de sesión?
Otra información: Ejecución de Python 2.7 en Linux Mint
Pasta completa:
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
estás usando? No puedo encontrar ninguna referencia de esa excepción en la fuente actual del proyecto .Respuestas:
En su caso, la excepción la
NullSessionInterface
genera la implementación de la sesión, que es el tipo de sesión predeterminado cuando usa Flask-Session. Eso es porque nunca le das laSESSION_TYPE
configuración a Flask ; no es suficiente establecerlo como global en su módulo. El código de ejemplo de inicio rápido de Flask-Session establece un global, pero luego usa el módulo actual como un objeto de configuración al llamarapp.config.from_object(__name__)
.Este valor predeterminado no tiene mucho sentido con Flask 0.10 o más reciente;
NullSession
puede haber tenido sentido con Flask 0.8 o 0.9, pero en la versión actual laflask.session.NullSession
clase se usa como señal de error. En su caso, ahora le da el mensaje de error incorrecto.Establezca la
SESSION_TYPE
opción de configuración en otra cosa. Escoja uno deredis
,memcached
,filesystem
omongodb
, y asegúrese de ponerlo enapp.config
(directamente oa través de los diversosConfig.from_*
métodos ).Para una prueba rápida, configurarlo en
filesystem
es más fácil; hay suficiente configuración predeterminada para que funcione sin dependencias adicionales:if __name__ == "__main__": app.secret_key = 'super secret key' app.config['SESSION_TYPE'] = 'filesystem' sess.init_app(app) app.debug = True app.run()
Si ve este error y que está no está usando el matraz de sesión, entonces algo tiene mal se ha ido con el establecimiento el secreto. Si está configurando
app.config['SECRET_KEY']
oapp.secret_key
en unif __name__ == "__main__":
guardia como el anterior y obtiene este error, entonces probablemente esté ejecutando su aplicación Flask a través de un servidor WSGI que importa su proyecto Flask como un módulo , y el__name__ == "__main__"
bloque nunca se ejecuta.De todos modos, siempre es mejor administrar la configuración de las aplicaciones de Flask en un archivo separado .
fuente
app.secret_key
es una mala práctica. Es mejor establecer la clave secreta a través delapp.config
objeto, lo que le permite descargar la configuración a un archivo externo.app.secret_key = ...
salí del bloque if , lo que en retrospectiva tiene sentido ya que Heroku ejecuta la aplicación a través de gunicorn, lo que significa que elif __name__ == "__main__":
bloque nunca se ingresa.flask_session
, y se llama a la colección predeterminadasessions
.Establecer la clave secreta fuera de
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()
Cuando inicia su aplicación ejecutando
flask run
elif __name__ == '__main__':
bloque se omite. Si no desea omitirlo, ejecutepython app.py
.fuente
Prueba esto:
app = Flask(__name__) app.config['SESSION_TYPE'] = 'memcached' app.config['SECRET_KEY'] = 'super secret key' sess = Session()
Y elimine su
app.secret_key
tarea en la parte inferior.fuente