我使用Flask-Login和Flask-Principal处理Flask应用程序,到目前为止一切正常,除了记住Flask-Login的功能。
实际上,记住我的功能在Flask-Login方面起作用,但Flask-Principal的idenity_loaded函数不会被触发。
当我记录@ login_manager.user_loader和@ identity_loaded.connect的调用时,看到我在登录时都被调用,但是当我关闭浏览器并再次启动它时,只会调用@ login_manager.user_loader。所以我的用户基本上登录但没有任何角色。
Flask-Login在GitHub上关闭了Issue #19,但它实际上没有回答我的问题: - /
有人知道如何在用户从cookie加载时做出反应吗?
答案 0 :(得分:4)
在before_request上,flask-principal
一次运行一个identity_loaders,直到找到任何标识。
如果找不到任何身份,则不会调用identity_loaded
。
默认情况下,第一个identity_loader始终是会话加载器。
当您重新启动浏览器时,会话将会消失,因此flask-principal
无法加载任何标识,因此不会调用identity_loaded
回调。但您仍然登录,因为flask-login
的Cookie'meleet_token'将在31天后过期。
因此,为了摆脱这种特性,你可以添加新的identity_loader
,它只会在会话到期时运行。
principal = Principal(app)
@principal.identity_loader
def load_identity_when_session_expires():
if hasattr(current_user, 'id'):
return Identity(current_user.id)