Прямо сейчас я использую стороннюю библиотеку Flask-Session, и мне не удается заставить сеанс работать.
Когда я подключаюсь к своему сайту, я получаю следующую ошибку:
RuntimeError: сеанс недоступен, так как не был установлен секретный ключ. Установите secret_key в приложении на что-нибудь уникальное и секретное.
Ниже мой код сервера.
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()
Как видите, я установил секретный ключ приложения. Что я делаю неправильно?
Есть ли другие варианты сеанса?
Дополнительная информация: Запуск Python 2.7 на Linux Mint
Полная паста:
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
пользуетесь? Я не могу найти ссылку на это исключение в текущем источнике проекта .Ответы:
В вашем случае исключение вызывается
NullSessionInterface
реализацией сеанса, которая является типом сеанса по умолчанию при использовании Flask-Session. Это потому, что вы никогда не передаетеSESSION_TYPE
конфигурацию Flask ; это не достаточно , чтобы установить его в качестве глобального в вашем модуле. Код примера быстрого запуска Flask-Session действительно устанавливает глобальный, но затем использует текущий модуль в качестве объекта конфигурации, вызываяapp.config.from_object(__name__)
.Это значение по умолчанию не имеет особого смысла с Flask 0.10 или новее;
NullSession
мог иметь смысл с Flask 0.8 или 0.9, но в текущей версииflask.session.NullSession
класс используется как сигнал об ошибке. В вашем случае теперь выдается неправильное сообщение об ошибке.Установите
SESSION_TYPE
для параметра конфигурации другое значение. Выберите один изredis
,memcached
,filesystem
илиmongodb
, и убедитесь , чтобы установить его вapp.config
(непосредственно или через различныеConfig.from_*
методы ).Для быстрого тестирования
filesystem
проще всего установить его ; там достаточно конфигурации по умолчанию, чтобы она работала без дополнительных зависимостей:if __name__ == "__main__": app.secret_key = 'super secret key' app.config['SESSION_TYPE'] = 'filesystem' sess.init_app(app) app.debug = True app.run()
Если вы видите эту ошибку и не используете Flask-Session, значит, что-то пошло не так с установкой секрета. Если вы устанавливаете
app.config['SECRET_KEY']
илиapp.secret_key
используетеif __name__ == "__main__":
охранник, как указано выше, и вы получаете эту ошибку, то вы, вероятно, запускаете свое приложение Flask через сервер WSGI, который импортирует ваш проект Flask как модуль , и__name__ == "__main__"
блок никогда не запускается.В любом случае всегда лучше управлять конфигурацией приложений Flask в отдельном файле .
источник
app.secret_key
- плохая практика. Лучше установить секретный ключ черезapp.config
объект, что позволяет выгрузить конфигурацию во внешний файл.app.secret_key = ...
вышел из блока if - что, оглядываясь назад, имеет смысл, поскольку Heroku запускает приложение через gunicorn, что означает, чтоif __name__ == "__main__":
блок никогда не вводится.flask_session
и вызывается коллекция по умолчаниюsessions
.Установите секретный ключ вне
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()
При запуске приложения, запустив блок получает пропускаются. Если вы не хотите его пропускать, используйте .
flask run
if __name__ == '__main__':
python app.py
источник
Попробуй это:
app = Flask(__name__) app.config['SESSION_TYPE'] = 'memcached' app.config['SECRET_KEY'] = 'super secret key' sess = Session()
И удалите свое
app.secret_key
задание внизу.источник