2014-06-30 61 views
5

我使用Flask-Login和Flask-Principal工作在一个Flask应用程序上,除了记住Flask-Login的功能外,一切正常。Flask-Principal,Flask-Login,remember_me和identity_loaded

实际上记忆我的功能在Flask-Login一侧工作,但Flask-Principal的idenity_loaded功能不会被触发。

当我登录@ login_manager.user_loader和@ identity_loaded.connect的调用时,看到两者都在我登录时被调用,但是当我关闭浏览器并再次启动时,只调用了@ login_manager.user_loader。所以我的用户基本登录,但没有获得任何角色。

烧瓶登录一个已经在GitHub上关闭Issue #19但它实际上并没有回答我的问题: -/

有没有人一个想法如何,当用户获得从cookie加载的反应呢?

+0

您正在使用哪个版本的Flask-Login? – b4stien

+0

Flask == 0.10.1,Flask-Principal == 0.4.0,Flask-Login == 0.2.11和Python 3.4.1 – Bouni

回答

4

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

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

当您重新启动浏览器时,会话将消失,因此flask-principal无法加载任何身份,因此您的identity_loaded回调将不会被调用。但是您仍然登录,因为flask-login的cookie'remember_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) 
+1

这很重要 – dmitrybelyakov

相关问题