使用gunicorn和Flask时出现CSRF令牌错误

使用gunicorn和Flask时出现CSRF令牌错误,flask,gunicorn,flask-wtforms,Flask,Gunicorn,Flask Wtforms,我开发了一个web应用程序,其中包括用户登录和注册的功能。我已经按照文档和教程完成了所有工作,所有工作都与flask服务器配合良好 问题是:我使用gunicorn并启动web服务器,在几个不同的浏览器(Linux上的Brave和Firefox,Android上的Brave)上打开地址(localhost:8000),我只能从一个客户端登录(单个或多个不同的用户)。当我尝试从另一个服务器执行此操作时,它抛出400个错误请求(CSRF会话令牌丢失或CSRF会话令牌不匹配) 现在,使用Flasks服务

我开发了一个web应用程序,其中包括用户登录和注册的功能。我已经按照文档和教程完成了所有工作,所有工作都与flask服务器配合良好

问题是:我使用gunicorn并启动web服务器,在几个不同的浏览器(Linux上的Brave和Firefox,Android上的Brave)上打开地址
(localhost:8000)
,我只能从一个客户端登录(单个或多个不同的用户)。当我尝试从另一个服务器执行此操作时,它抛出400个错误请求(CSRF会话令牌丢失或CSRF会话令牌不匹配)

现在,使用Flasks服务器时不会发生这种情况。它只在使用gunicorn时发生

我已经将应用程序部署到Heroku(使用免费计划),我希望多个用户同时登录。这在我的应用程序拥有的所有其他表单上都会发生

所有环境变量、密钥都已正确配置,使用Flask Server时一切正常。使用Gunicorn不会导致除此之外的任何其他问题。有时,从单个客户端登录也不起作用

任何帮助都将不胜感激。我已经看过了其他相关的线程/问题,但它们没有提到我的问题

很抱歉回复太晚(也许它可以帮助将来的人)

简短的回答是:
使用:

而不是:

app.app_context().push()
它永远不会关闭

答案很长:

我猜您使用Flask WTF管理CSRF, 如果是,则在generate_csrf函数中有一个If bloc(),它在生成新的csrf令牌之前检查flask g变量。它工作得很好,但是当g变量没有在每个新请求上重新初始化时(原因见下文),它会在尝试登录的不同用户之间产生冲突

未重新初始化flask g变量的主要原因是应用程序上下文被手动推送(通常由:app.app_context().push()推送),但未关闭,在这种情况下,应用程序上下文永远不会被拆除。请参见:


最后,我认为flask调试模式中存在一些问题,它会强制拆除应用程序上下文并重新初始化g变量。

也许您可以提供更多信息,说明如何配置,其他人可以使用一些示例来重现问题?
app.app_context().push()