我正在使用Gunicorn作为Web服务器运行Flask应用程序。整个项目部署到Heroku。
- 程序文件 *
web: gunicorn app:app --log-file=-
Flask会话是在服务器端实现的,只有会话ID存储在flask.session
对象中。每当我尝试登录时,我首先正确登录,但随后被重定向到起始站点(应该是用户站点)。
- LoginController。py*
def login(form) :
User.session.set(User.getByLogin(form))
if User.session.exists() :
return redirect(Urls.home)
return redirect(Urls.login)
日志显示User.session.exists()
返回True
,但在下一个方法中(重定向期间)。..
- HomeController。py*
def view() :
if User.session.exists() :
return CourseController.view()
return render_template("home.html")
...相同的方法返回False
。
- User.session对象 *
def exists(self) :
key = session.get("user_key")
user = self.users.get(key)
Log.debug("session::exists", user = user)
return user is not None
在以下所有请求中,用户随机登录或不登录。
这可能是什么原因呢?我听说session
对象太大会导致数据丢失,但我只在其中存储整数。
4条答案
按热度按时间o75abkj41#
看来有两个问题:
app.secret_key
不应设置为os.urandom(24)
,因为每个worker都有另一个密钥在运行时将会话存储在数据库中而不是字典中可以解决这个问题。
utugiqy62#
我也有过类似的问题,但对我来说,答案与饼干有关。当我打开开发环境时,一个新的会话正在创建,然后在去google时另一个会话,在成功登录后创建一个新会话。
问题是我的SESSION_COOKIE_DOMAIN不正确,cookie域被设置为不同的主机。为了本地开发目的,我设置SESSION_COOKIE_DOMAIN = '127。0.0.1 ',并使用http://127.0.0.1:来访问它,现在它工作正常。
k3fezbri3#
我有同样的问题,而在本地工作的工作,但在服务器上什么也没有。
我换了应用程序的时候发现的。secret_key'从 “my_secret_key” 到 * os。urandom(24)* 其中一个我的测试用户总是在会话中,另一个从未在会话中设置。阅读几页,我确实试着给cookie添加一个名字
现在它像预期的那样工作,我可以登录,转到其他网页,注销将从会话中删除密钥。
umuewwlo4#
对于每个遇到这个问题的人,我将提供一个不同的观点:
这可能与Gunicorn的多工无关!
首先要做的就是确保你正确使用了flask的会话。不要在global中定义session变量!而是在view函数下定义它。否则,它将只是一个名为“session”的常规变量,并在不同客户端之间共享,而不是为不同客户端单独创建的flask的会话变量。
如果你做的正确(使用文件系统检查:
app.config["SESSION_TYPE"] = "filesystem"
),在flask_session文件夹下,应该为每个客户端创建一个文件来存储会话变量(确保使用多个浏览器或设备检查),因此,即使使用gunicorn的多个worker,会话变量仍然会持续存在。