繁体   English   中英

Heroku gunicorn flask 登录不正常

[英]Heroku gunicorn flask login is not working properly

我有一个 flask 应用程序,它使用 Flask-Login 进行身份验证。 使用 flask 内置的 web 服务器和本地运行的 gunicorn,在本地一切正常。 但是当它在 heroku 上时它是错误的,有时它会让我登录,有时它不会。 当我在导航后的几秒钟内成功登录时,我的 session 就被销毁并让我自动注销。 这应该在用户注销时发生。

在我看来,以下代码片段可能是相关的:

@app.before_request
def before_request():
    g.user = current_user

# I have index (/) and other views (/new) decorated with @login_required

我可能对此有类似的问题 它还没有任何答案,从我从评论中读到的内容来看,作者只是用python app.py运行了他的应用程序。 那就是通过使用 flask 内置的 web 服务器。 但是,我似乎无法复制他的解决方法,因为运行app.run(host='0.0.0.0')会在端口5000中运行该应用程序,而且我似乎无法设置port=80因为许可。

我看不到日志有任何帮助,只是即使我应该验证它也没有验证。

当我通过身份验证并尝试导航到/new/交替直到它注销我时的部分日志:

2016-09-25T06:57:53.052378+00:00 app[web.1]: authenticated - IP:10.179.239.229
2016-09-25T06:57:53.455145+00:00 heroku[router]: at=info method=GET path="/" host=testdep0.herokuapp.com request_id=c7c8f4c9-b003-446e-92d8-af0a81985e72 fwd="124.100.201.61" dyno=web.1 connect=0ms service=116ms status=200 bytes=6526
2016-09-25T06:58:11.415837+00:00 heroku[router]: at=info method=GET path="/new" host=testdep0.herokuapp.com request_id=ae5e4e29-0345-4a09-90c4-36fb64785079 fwd="124.100.201.61" dyno=web.1 connect=0ms service=7ms status=200 bytes=2552
2016-09-25T06:58:13.543098+00:00 heroku[router]: at=info method=GET path="/" host=testdep0.herokuapp.com request_id=47696ab9-57b9-4f20-810a-66033e3e9e50 fwd="124.100.201.61" dyno=web.1 connect=0ms service=8ms status=200 bytes=5982
2016-09-25T06:58:18.037766+00:00 heroku[router]: at=info method=GET path="/new" host=testdep0.herokuapp.com request_id=98912601-6342-4d71-a106-26056e4bbb21 fwd="124.100.201.61" dyno=web.1 connect=0ms service=3ms status=200 bytes=2552
2016-09-25T06:58:19.619369+00:00 heroku[router]: at=info method=GET path="/" host=testdep0.herokuapp.com request_id=2b04d31f-93a2-4653-83a4-f95ca9b97149 fwd="124.100.201.61" dyno=web.1 connect=0ms service=3ms status=302 bytes=640
2016-09-25T06:58:19.953910+00:00 heroku[router]: at=info method=GET path="/login?next=%2F" host=testdep0.herokuapp.com request_id=e80d15cd-e9ad-45ff-ae54-e156412fe4ff fwd="124.100.201.61" dyno=web.1 connect=0ms service=3ms status=200 bytes=2793

简介:

web: gunicorn app:app

通过在--preload添加--preload选项,解决了该问题。 我不完全确定这是如何解决问题的,如果有人可以解释,我将不胜感激。

更新的Procfile:

web: gunicorn app:app --preload

遵循krato所说的(完全可以正常工作),我的应用程序仍然无法完美运行。 即使它是第一次登录,我也可以保持刷新状态,最终将被注销。 因此,阅读本文后,我将gunicorn设置为仅使用1名工人,如下所示:

网址:gunicorn -w 1:app --preload

这似乎可以解决问题。

只是为来到这里沉迷于此问题的任何人添加一些指示

这个问题可能是因为生产中的多线程环境

在处理任何请求上下文 flask-login 查询load_user ,您必须根据您的生产环境对其进行自定义

你必须实现类似下面的东西,这取决于你如何在处理请求上下文之前将用户 object 提供给 flask-login

@login_manager.user_loader
def load_user(id):
    app.logger.debug(f"session {session}")
    if session:
        return User.query.filter_by(id=session['_user_id']).first() 

检查 _load_user 的工作原理,因为它已被调用以加载 current_user https://github.com/maxcountryman/flask-login/blob/main/src/flask_login/login_manager.py#L301

在文档https://flask-login.readthedocs.io/en/latest/#how-it-works中查看

检查这个也许你只需要在cookie https中添加记住我://github.com/maxcountryman/flask-login/blob/main/src/flask_login/login_manager.py#L331

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM