在Heroku上使用Gunicorn的Flask应用程序中,Flask会话不会持久存在

时间:2015-06-22 16:00:50

标签: python session heroku flask gunicorn

我正在使用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()返回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对象会导致数据丢失,但我只会在其中存储整数。

2 个答案:

答案 0 :(得分:10)

看起来有两个问题:

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

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

答案 1 :(得分:0)

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

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