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-Sessionestá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
NullSessionInterfacegenera 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_TYPEconfiguració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;
NullSessionpuede haber tenido sentido con Flask 0.8 o 0.9, pero en la versión actual laflask.session.NullSessionclase se usa como señal de error. En su caso, ahora le da el mensaje de error incorrecto.Establezca la
SESSION_TYPEopción de configuración en otra cosa. Escoja uno deredis,memcached,filesystemomongodb, y asegúrese de ponerlo enapp.config(directamente oa través de los diversosConfig.from_*métodos ).Para una prueba rápida, configurarlo en
filesystemes 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_keyen 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_keyes una mala práctica. Es mejor establecer la clave secreta a través delapp.configobjeto, 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 runelif __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_keytarea en la parte inferior.fuente