сеанс недоступен, так как секретный ключ не установлен. Установите secret_key в приложении на что-то уникальное и секретное. Фляга/Хероку

Приложение фляги может войти и зарегистрироваться на локальном хосте. Но это становится проблемой, когда я подталкиваю его к героку. Он показывает вышеупомянутую ошибку. Вот код app.py

from flask import Flask, render_template, request, redirect, jsonify, url_for, flash
from sqlalchemy import create_engine, asc, desc
from sqlalchemy.orm import sessionmaker
from database_setup import Base, User, BlogPost
from flask import session as login_session
import random
import string
from wtforms import Form, BooleanField, TextField, PasswordField, validators
from passlib.hash import sha256_crypt


app = Flask(__name__)


#Connecting to database
engine = create_engine('sqlite:///travellerdata.db')
Base.metadata.bind = engine

DBSession = sessionmaker(bind=engine)
session = DBSession()

И заканчивается...

if __name__ == "__main__":
    app.secret_key = 'some secret key'
    app.debug = True
    app.run()

person Flyn Sequeira    schedule 26.02.2016    source источник
comment
Какой HTTP-сервер вы используете? стрелорог?   -  person joshreesjones    schedule 26.02.2016
comment
Я предполагаю, что когда ваш HTTP-сервер загружает ваше приложение, __name__ не устанавливается на 'main'. Попробуйте переместить app.secret_key = 'some secret key' за пределы блока if.   -  person joshreesjones    schedule 26.02.2016
comment
У меня буквально только что была эта проблема (хотя решение моей проблемы было другим).   -  person joshreesjones    schedule 26.02.2016
comment
Я поддерживаю решение @mathguy54. НО На Heroku есть возможность установить секретный ключ через графический интерфейс. Если есть возможность, стоит рассмотреть и этот вариант. Хранение секретного ключа открытого текста в исходном коде обычно не является безопасным ходом.   -  person franklin    schedule 26.02.2016
comment
Да, вы должны настроить приложение сразу после создания экземпляра приложения.   -  person reptilicus    schedule 26.02.2016


Ответы (4)


У меня такая же проблема, когда я использую flask-login для создания идентификатора сеанса, он отлично работает, когда я запускаю его напрямую, но выводит ошибку, когда я использую HTTP-сервер. Исходный код выглядит так:

if __name__ == "__main__":
    app.secret_key = os.urandom(24)
    app.run()

Затем я переместил app.secret_key = os.urandom(24) из __name__ и поместил под app = Flask(__name__) вот так:

app = Flask(__name__)
app.secret_key = os.urandom(24)

login_manager = flask_login.LoginManager()
login_manager.init_app(app)

И теперь он работает нормально.

person Yibei Huang    schedule 18.08.2016

Вполне вероятно, что когда ваш HTTP-сервер загружает ваше приложение, __name__ не равно 'main'. Попробуйте переместить строку app.secret_key = 'some secret key' за пределы блока if.

Не рекомендуется помещать ваш секретный ключ в исходный код, потому что, если кто-то его получит, он может злонамеренно получить доступ к вашей системе. Попробуйте сохранить его в файле в каталоге экземпляра приложения (фрагмент здесь) или поместите его в переменная окружения (объяснение здесь).

person joshreesjones    schedule 26.02.2016
comment
Генерируйте секретный ключ каждый раз, когда сервер запускается с помощью app.secret_key = os.urandom(24), но убедитесь, что import os находится в начале файла. - person Musky; 04.05.2018

Исключение вызывается реализацией сеанса NullSessionInterface, который является типом сеанса по умолчанию при использовании Flask-Session. Это потому, что вы никогда не передаете конфигурацию SESSION_TYPE в Flask; недостаточно установить его как глобальный в вашем модуле.

Это значение по умолчанию не имеет особого смысла с Flask 0.10; это могло иметь смысл с Flask 0.8 или 0.9, но текущая версия используется как сигнал ошибки. В вашем случае это дает вам неправильное сообщение об ошибке сейчас.

Установите параметр конфигурации SESSION_TYPE на что-то другое. Выберите один из Redis, memcached, файловую систему или mongodb.

Установить файловую систему проще всего; там достаточно конфигурации по умолчанию, чтобы эта работа работала без дополнительных зависимостей:

if __name__ == "__main__":
    app.secret_key = 'super secret key'
    app.config['SESSION_TYPE'] = 'filesystem'

    sess.init_app(app)

app.debug = True
app.run()
person Rishit Shah    schedule 05.02.2017

Я прочитал это на случайном веб-сайте после того, как перепробовал множество решений, но ничего не сработало, решение было очень простым для меня, я просто поставил app.secret_key = 'суперсекретный ключ' после app = Flask (имя) прямо не внизу файла.

person Heba Shubib    schedule 27.11.2020
comment
пожалуйста, исправьте структуру ответа - person Cem Kaan; 27.11.2020