Flask-Principal,Flask-Login,remember_me和identity_loaded

Bou*_*uni 5 python identity flask flask-login flask-principal

我使用Flask-Login和Flask-Principal处理Flask应用程序,除了记住Flask-Login的功能外,一切正常.

实际上,remember me函数在Flask-Login端工作,但Flask-Principal的idenity_loaded函数不会被触发.

当我记录@ login_manager.user_loader和@ identity_loaded.connect的调用时,看到我登录时都被调用,但是当我关闭浏览器并再次启动它时,只会调用@ login_manager.user_loader.所以我的用户基本上登录但没有角色.

Flask-Login 在GitHub上有一个已关闭的问题#19,但它实际上没有回答我的问题: - /

有人知道如何在用户从cookie加载时做出反应吗?

suz*_*kya 6

在 before_request 上,flask-principal一次运行一个identity_loaders,直到找到任何身份。如果没有找到任何身份,identity_loaded则不会被调用。

默认情况下,第一个identity_loader始终是会话加载程序。

当您重新启动浏览器时,会话将消失,因此flask-principal无法加载任何身份,因此您的identity_loaded回调将不会被调用。但您仍然登录,因为flask-logincookie 'remember_token' 将在 31 天后过期。

因此,为了摆脱这种特性,您可以添加 new identity_loader,它只会在会话过期时运行。

principal = Principal(app)

@principal.identity_loader
def load_identity_when_session_expires():
    if hasattr(current_user, 'id'):
        return Identity(current_user.id)
Run Code Online (Sandbox Code Playgroud)