我有一个运行 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 无法读取无效会话。然而,在社区中并没有看到太多相关内容,所以我想我一定仍然做错了什么。
我迂回地找到了答案。但本质上我发现了与这篇文章中发生的事情相似的方面:
直接来自他们的帖子:
简短的回答: 使用:
与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 令牌正常工作。