会话不可用,因为没有设置密钥。将应用程序上的 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 函数错误 - “密钥功能不可用,因为为此函数应用启用了身份验证/授权。”