Flask-Principal,Flask-Login,remember_me和identity_loaded

时间:2014-06-30 09:56:53

标签: python flask identity flask-login flask-principal

我使用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加载时做出反应吗?

1 个答案:

答案 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)