Flask 会话在 Heroku 上使用 Gunicorn 的 Flask 应用程序中的请求之间不持久

Flask session not persistent across requests in Flask app with Gunicorn on Heroku

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

Procfile

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() returns True 但在下一个方法中(重定向期间)...

HomeController.py

def view() :
    if User.session.exists() :
        return CourseController.view()
    return render_template("home.html")

...同样的方法returns 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 对象会导致数据丢失,但我只在其中存储整数。

看起来有两个问题:

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

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

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

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

我有同样的问题,在本地工作时有效,但在服务器上没有任何反应。

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

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

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