会话不可用,因为没有设置密钥。将应用程序上的 secret_key 设置为唯一且机密的东西。烧瓶/Heroku

Posted

技术标签:

【中文标题】会话不可用,因为没有设置密钥。将应用程序上的 secret_key 设置为唯一且机密的东西。烧瓶/Heroku【英文标题】:the session is unavailable because no secret key was set. Set the secret_key on the application to something unique and secret. Flask/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 设置密钥。如果可能的话,您也应该考虑该选项。在源代码中存储明文密钥通常不是安全措施。 是的,您应该在实例化应用程序后立即配置应用程序 【参考方案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) 之后直接不在文件底部。

【讨论】:

请修正你的答案结构

以上是关于会话不可用,因为没有设置密钥。将应用程序上的 secret_key 设置为唯一且机密的东西。烧瓶/Heroku的主要内容,如果未能解决你的问题,请参考以下文章

用户配置文件和 HKLM 注册表均不可用。使用临时密钥存储库。应用程序退出时,受保护的数据将不可用

Azure 函数错误 - “密钥功能不可用,因为为此函数应用启用了身份验证/授权。”

SSH 密钥设置但仍要求输入密码(但不是用于第二、第三等会话)

Symfony 会话不可用异常

在Parse云中存储密钥的最佳方法是什么?

在 Django 中不循环会话密钥有啥风险?