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"
现在它按预期工作,我可以登录,转到其他网页,然后注销将从会话中删除密钥。
我是 运行 一个使用 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"
现在它按预期工作,我可以登录,转到其他网页,然后注销将从会话中删除密钥。