【问题标题】:the session is unavailable because no secret key was set. Set the secret_key on the application to something unique and secret. Flask/Heroku会话不可用,因为没有设置密钥。将应用程序上的 secret_key 设置为唯一且机密的东西。烧瓶/Heroku
【发布时间】:2016-06-10 00:41:35
【问题描述】:

flask 应用程序可以在 localhost 上登录和注册一切正常。但是当我将它推到heroku时,这成为一个问题。它显示了上述错误。这是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()

【问题讨论】:

  • 您使用的是什么 HTTP 服务器?独角兽?
  • 我猜当你的 HTTP 服务器正在加载你的应用程序时,__name__ 没有设置为'main'。尝试将app.secret_key = 'some secret key' 移到 if 块之外。
  • 我确实遇到了这个问题(尽管我的问题的解决方案与此不同)。
  • 我支持 @mathguy54 的 sol'n。但是在 Heroku 上,有一个选项可以通过 GUI 设置密钥。如果可能的话,您也应该考虑该选项。在源代码中存储明文密钥通常不是安全措施。
  • 是的,您应该在实例化应用程序后立即配置应用程序

标签: python heroku login flask secret-key


【解决方案1】:

很可能当您的 HTTP 服务器正在加载您的应用程序时,__name__ 不等于 'main'。尝试将行 app.secret_key = 'some secret key' 移到 if 块之外。

将您的密钥放在源代码中并不是一个好主意,因为如果有人得到它,他们就可以恶意地访问您的系统。尝试将其存储在应用程序实例目录中的文件中 (snippet here) 或将其放入环境变量中 (explanation here)。

【讨论】:

  • 每次服务器以 app.secret_key = os.urandom(24) 启动时生成一个密钥,但确保文件顶部有 import os。
【解决方案2】:

我在使用flask-login 生成会话ID 时遇到了同样的问题,当我直接运行它时它工作正常,但当我使用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)

现在可以正常使用了。

【讨论】:

  • 你刚刚把我从心碎中救了出来!谢啦。呸!我欠你一杯酒。
【解决方案3】:

异常由 NullSessionInterface 会话实现引发,这是您使用 Flask-Session 时的默认会话类型。那是因为您实际上从未将 SESSION_TYPE 配置提供给 Flask。在模块中将其设置为全局是不够的。

这个默认值对于 Flask 0.10 没有多大意义;它可能对 Flask 0.8 或 0.9 有意义,但当前版本被用作错误信号。在您的情况下,它现在会给您错误的错误消息。

将 SESSION_TYPE 配置选项设置为其他值。选择 redis、memcached、filesystem 或 mongodb 之一。

将其设置为文件系统是最简单的;那里有足够的默认配置可以在没有额外依赖项的情况下工作:

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

    sess.init_app(app)

app.debug = True
app.run()

【讨论】:

    【解决方案4】:

    在尝试了很多解决方案后,我在随机网站上阅读了这篇文章,但没有任何效果解决方案对我来说非常简单,我只是把 app.secret_key = '超级密钥' app = Flask(name) 之后直接不在文件底部。

    【讨论】:

    • 请修正你的答案结构
    猜你喜欢
    • 2020-09-09
    • 1970-01-01
    • 2017-07-13
    • 2014-11-22
    • 2017-09-15
    • 2022-11-21
    • 2015-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多