Flask-Login > 0.6.0 不适用于 Azure Web 应用程序部署

问题描述 投票:0回答:1

我有一个运行 Flask 应用程序的 Azure Web 应用程序。我没有额外的工作人员,只是在默认设置下运行它。

自从从 Flask-Login 0.6.0 迁移到 0.6.3 后,过期时不再注销。

我有我的 init.py 文件

def create_app(config_env=os.getenv("ENV"), register_blueprints=True):

    app = Flask(__name__)

    app.config.from_object(config[config_env])

    db.init_app(app)
    lm.init_app(app)
    lm.login_view = "auth.login"
    lm.login_message_category = "info"
    lm.refresh_view = "auth.login"
    lm.needs_refresh_message = "Session timedout, please re-login"
    lm.login_message_category = "info"

    @app.before_request
    def my_func():
        session.modified = True

    @app.before_request
    def before_request():
        session.permanent = True
        current_app.permanent_session_lifetime = timedelta(minutes=1)

我有我的 model.py 文件:

@lm.user_loader
def load_user(user_id):
    return PortalUsers.query.get(int(user_id))

class PortalUsers(UserMixin, db.Model):
    __tablename__ = "tbl_PortalUsers"

    id = db.Column("Staff_Id", db.Integer, primary_key=True)
    first_name = db.Column("First_Name", db.String(100, "SQL_Latin1_General_CP1_CI_AS"))
    last_name = db.Column("Last_Name", db.String(100, "SQL_Latin1_General_CP1_CI_AS"))
    full_name = db.Column(
        db.String(201, "SQL_Latin1_General_CP1_CI_AS"),
        db.Computed("(([First_Name]+' ')+[Last_Name])", persisted=False),
    )
    phone = db.Column("Phone", db.String(10, "SQL_Latin1_General_CP1_CI_AS"))
    email = db.Column("Email", db.String(50, "SQL_Latin1_General_CP1_CI_AS"))
    role_type = db.Column("Role_Type", db.String(20, "SQL_Latin1_General_CP1_CI_AS"))
    portal_active = db.Column("Portal_Active", db.Integer)
    date_created = db.Column("Date_Created", db.DateTime, default=datetime.utcnow)
    created_by = db.Column("Created_By", db.String(100, "SQL_Latin1_General_CP1_CI_AS"))
    last_updated = db.Column("Last_Updated", db.DateTime, default=datetime.utcnow)
    last_updated_by = db.Column(
        "Last_Updated_By", db.String(100, "SQL_Latin1_General_CP1_CI_AS")
    )
    date_deleted = db.Column("Date_Deleted", db.DateTime)
    time_zone_id = db.Column(
        "TimeZoneId",
        db.Integer,
        db.ForeignKey("tbl_TimeZones.id"),
        unique=False,
        nullable=False,
        default=1,
    )
    password = db.Column("Password", db.String(64), nullable=False)

在我的本地主机上,一切都按预期工作,1 分钟后,如果我刷新链接,我将被重定向到登录页面,并显示一条闪烁的消息。

在我的 Azure Web 应用程序中进行生产时,我不会被重定向。生产环境中的会话 cookie 确实发生了变化。例如:

1 分钟后:

我不知道在哪里排除故障。和Azure有关系吗?或者是我缺少 FLask-Login 的标志?或者它实际上与 Flask 有关吗?任何帮助我指明正确方向的帮助将不胜感激。

更新

查看本地主机上的会话 Cookie,我在登录和到期时获得预期的会话。例如,过期的会话 cookie 是:

eyJfZnJlc2giOmZhbHNlLCJfcGVybWFuZW50Ijp0cnVlLCJjc3JmX3Rva2VuIjoiYWFhNTE1ZTEwNDg5OGZlYzMwZDk1ZDFkY2IyN2ZkYWJiOTI0M2Y3MyJ9.ZU2zrQ.-GCaBYI8ksvVBRjylRgLM2Cmst0

解码为:

{
    "_fresh": false,
    "_permanent": true,
    "csrf_token": "aaa515e104898fec30d95d1dcb27fdabb9243f73"
}

但是在生产环境中,在到期或注销时,我会得到一个会话 cookie,如下所示: eyJfcGVybWFuZW50Ijp0cnVlfQ.ZU20qQ.tyNVkqrhHbHtDwQUU2PMc7p6Pco

这给了我[错误:不是 JSON 数据]

这让我相信它与 Flask 有关...因为 Flask-Login 无法读取无效会话。然而,在社区中并没有看到太多相关内容,所以我想我一定仍然做错了什么。

python flask gunicorn flask-login
1个回答
0
投票

我迂回地找到了答案。但本质上我发现了与这篇文章中发生的事情相似的方面:

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

直接来自他们的帖子:

简短的回答: 使用:

与app.app_context(): 你的代码 而不是:

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

在我的代码中更改此设置:

原文:

from application import create_app

app = create_app()
app.app_context().push()

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=5008, debug=True)
    #app.run()
    

from application import create_app

app = create_app()
with app.app_context():

    if __name__ == "__main__":
        app.run(host='0.0.0.0', port=5008, debug=True)
        #app.run()

现在,当我注销或超时时,会维护会话 cookie,这允许 Flask-Login 以及 CSRF 令牌正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.