секретний ключ не встановлений під час сеансу колби за допомогою розширення Flask-Session


83

Зараз я використовую флягу сторонньої бібліотеки 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ви використовуєте? Я не можу знайти жодного посилання на цей виняток у поточному джерелі проекту .
Мартін Пітерс

@MartijnPieters Будь-яка ідея, як я міг це зрозуміти? Я щойно встановив для нього піп
MintyAnt

Повідомлення про виняток уже знайдено; справа в самій колбі, а не в сесії колби.
Мартін Пітерс

@MartijnPieters Я додав повний зворотний зв'язок. Це з'являється, коли я намагаюся встановити клавішу 'userId', як ви бачите
MintyAnt

Відповіді:


96

У вашому випадку виняток викликає NullSessionInterfaceреалізація сеансу, який є типом сеансу за замовчуванням, коли ви використовуєте Flask-Session. Це тому, що ви ніколи фактично не надаєте SESSION_TYPEконфігурацію Flask ; це мало , щоб встановити його в якості глобального в вашому модулі. У Фляга-Session QUICKSTART приклад коду робить набір глобальної, але потім використовує поточний модуль як об'єкт конфігурації при допомоги виклику 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 в окремому файлі .


3
Зверніть увагу, що використання app.secret_key- це погана практика. Краще встановити секретний ключ через app.configоб'єкт, що дозволяє розвантажити конфігурацію у зовнішній файл.
Мігель

4
Примітка для користувачів Heroku, які закінчуються тут: я не отримав приклад, щоб він працював, поки не app.secret_key = ...вийшов з блоку if - що, оглядаючись назад, має сенс, оскільки Heroku запускає додаток через gunicorn, що означає, що if __name__ == "__main__":блок ніколи не вводиться.
Паскаль

'Встановіть секретний ключ за межами if name ==' main ':' відповідь тут від stackoverflow.com/users/2900124/hayden нижче - краща відповідь (працював на розміщеному сервері, а цей - ні)
ng10

@ ng10: ця відповідь застосовується, коли ви не використовуєте Flask-Session . Проблема в питанні тут полягає в тому, що повідомлення про помилку, яке ви бачите під час використання Flask-Session, не є корисним і помилковим. Якщо ви бачите повідомлення про помилку, коли не використовуєте Flask-Session, тоді може застосовуватися інша відповідь. Я оновив відповідь на обидва варіанти.
Мартін Пітерс

1
@iamai: це задокументовано розділом Конфігурація Flask-Session ; для mongodb ім'я бази даних flask_sessionза замовчуванням - і викликається колекція за замовчуванням sessions.
Мартін Пітерс

59

Встановіть секретний ключ за межами 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 runif __name__ == '__main__':python app.py


Я запускаю флешку на сервері amazon ec2 apache2 Ubuntu, використовуючи oauth2.0 для доступу до інформації календаря Google. Ця відповідь - проста модифікація, яка змусила його працювати. Дякую!
jas

Це відповідь на інше запитання , коли тип сеансу налаштований правильно або ви взагалі не використовуєте Flask-Session, але секрету не встановлено, оскільки сервер WSGI завантажив модуль імпортом, а не як основний сценарій.
Мартін Пітерс

14

Спробуйте це:

app = Flask(__name__)
app.config['SESSION_TYPE'] = 'memcached'
app.config['SECRET_KEY'] = 'super secret key'
sess = Session()

І видаліть своє app.secret_keyзавдання внизу.


Я зробив це, не пощастило, та сама помилка. Я можу оновити
поштовий
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.