【问题标题】:Flask session not persistent across requests in Flask app with Gunicorn on HerokuFlask 会话在 Heroku 上的 Gunicorn 的 Flask 应用程序中的请求之间不持久
【发布时间】:2015-09-08 04:19:40
【问题描述】:

我正在运行一个使用 Gunicorn 作为 Web 服务器的 Flask 应用程序。 整个项目部署到 Heroku。

过程文件

web: gunicorn app:app --log-file=-

Flask 会话是在服务器端实现的,flask.session 对象中只存储了一个会话 ID。 每当我尝试登录时,我首先会正确登录,但随后会被重定向到起始站点(应该是用户站点)。

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 对象会导致数据丢失,但我只是在其中存储整数。

【问题讨论】:

  • 当 gunicorn 与多个工人一起运行时,两个工人之间不会共享会话。当用户使用第一个工作人员登录时,用户会话仅与该工作人员有关。当用户尝试另一个请求时,它会转到其他工作人员,在那里它不会获取用户详细信息,并且会要求您再次登录。我们也面临同样的问题。我查看了独角兽,但没有得到任何好的解决方案。
  • 这里有同样的问题(“出于某种原因,我存储会话的字典有时是空的,有时不是”)。大家有没有找到解决办法?

标签: python session heroku flask gunicorn


【解决方案1】:

我在本地工作时遇到了同样的问题,但在服务器上却没有。

当我将 'app.secret_key' 从 "my_secret_key" 更改为 os.urandom(24) 时发现我的一个测试用户一直在会话中,与另一个从未在会话中设置。阅读了几页我确实尝试在 cookie 中添加一个名称

app.config['SECRET_KEY'] = os.urandom(24)
# this is important or wont work
app.config['SESSION_COOKIE_NAME'] = "my_session"

现在它可以按预期工作了,我可以登录,转到其他网页,注销将从会话中删除密钥。

【讨论】:

    【解决方案2】:

    我遇到了类似的问题,但对我来说,答案与 cookie 有关。当我打开我的开发环境时正在创建一个新会话,然后在去 google 时创建另一个会话,在成功登录后创建一个新会话。

    问题是我的 SESSION_COOKIE_DOMAIN 不正确,并且 cookie 域被设置为不同的主机。为了我的本地开发目的,我设置了 SESSION_COOKIE_DOMAIN = '127.0.0.1',并使用http://127.0.0.1: 来访问它,它现在可以正常工作了。

    【讨论】:

      【解决方案3】:

      看起来有两个问题:

      • 不应将app.secret_key 设置为os.urandom(24),因为每个工作人员都会有另一个密钥
      • 由于某种原因,我存储会话的字典有时是空的,有时不是……虽然仍然没有找到原因

      在运行时将会话存储在数据库中而不是字典中可以解决问题。

      【讨论】:

      • 我遇到了类似的问题,但将 os.random(24) 更改为固定字符串似乎已经解决了 - flask.session 不再被清空(这意味着用户不会再被注销)。
      • 非常感谢。这个问题的答案是正确的。
      • 感谢您发布此内容,这结束了我数小时的调试
      • 您能否详细说明在数据库中存储会话的信息?我遇到了类似的问题。有什么例子吗?
      • 您可以将秘密存储在 Heroku 配置中
      猜你喜欢
      • 2017-01-08
      • 2015-08-29
      • 2011-03-01
      • 2019-04-19
      • 2012-11-26
      • 2021-09-16
      • 2016-05-28
      • 2013-03-11
      相关资源
      最近更新 更多