簡體   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