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

afdcj2ne  于 2023-04-30  发布在  其他
关注(0)|答案(4)|浏览(137)

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

o75abkj4

o75abkj41#

看来有两个问题:

  • app.secret_key不应设置为os.urandom(24),因为每个worker都有另一个密钥
  • 由于某种原因,我存储会话的dict有时是空的,有时不是。..还没找到原因

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

utugiqy6

utugiqy62#

我也有过类似的问题,但对我来说,答案与饼干有关。当我打开开发环境时,一个新的会话正在创建,然后在去google时另一个会话,在成功登录后创建一个新会话。
问题是我的SESSION_COOKIE_DOMAIN不正确,cookie域被设置为不同的主机。为了本地开发目的,我设置SESSION_COOKIE_DOMAIN = '127。0.0.1 ',并使用http://127.0.0.1:来访问它,现在它工作正常。

k3fezbri

k3fezbri3#

我有同样的问题,而在本地工作的工作,但在服务器上什么也没有。
我换了应用程序的时候发现的。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"

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

umuewwlo

umuewwlo4#

对于每个遇到这个问题的人,我将提供一个不同的观点:
这可能与Gunicorn的多工无关!
首先要做的就是确保你正确使用了flask的会话。不要在global中定义session变量!而是在view函数下定义它。否则,它将只是一个名为“session”的常规变量,并在不同客户端之间共享,而不是为不同客户端单独创建的flask的会话变量。
如果你做的正确(使用文件系统检查:app.config["SESSION_TYPE"] = "filesystem"),在flask_session文件夹下,应该为每个客户端创建一个文件来存储会话变量(确保使用多个浏览器或设备检查),因此,即使使用gunicorn的多个worker,会话变量仍然会持续存在。

相关问题