2013-10-09 32 views
14

我嘗試從flask-login中使用我的視圖中的當前用戶。於是,我就g object如何在flask-login中跟蹤當前用戶?

餘米分配flask.ext.login.current_user到g對象

@pot.before_request 
def load_users(): 
    g.user = current_user.username 

它的工作原理,如果用戶是正確的。但是當我做的註冊或登錄與錯誤的憑據 我得到這個錯誤

AttributeError: 'AnonymousUserMixin' object has no attribute 'username'

請微啓我在哪裏,我錯了......

回答

14

謝謝您的回答@Joe和@pjnola,大家都建議我提到flask-login docs

我發現,我們可以自定義匿名用戶類,所以我定製我的要求,

Anonymous class

#!/usr/bin/python 
#flask-login anonymous user class 
from flask.ext.login import AnonymousUserMixin 
class Anonymous(AnonymousUserMixin): 
    def __init__(self): 
    self.username = 'Guest' 

加入這個類anonymous_user

login_manager.anonymous_user = Anonymous

如果是匿名請求,則可以從中獲取用戶名。

+3

我建議讓匿名對象從AnonymousUserMixin繼承,而不是重新實現它。這樣,如果Flask-Login更改其API,則會得到這些更改。另外,'get_id'應該是一個返回'None'的方法,而不是「None」。 –

+0

我會和馬克在這裏說的一樣:'匿名(AnonymousUserMixin):' –

+0

當然@MarkHildreth,是的,這是更好的實現方式,謝謝 – naga4ce

5

AnonymousUserMixin沒有用戶名屬性。您需要覆蓋該對象並調用混合。查看LoginManager.anonymous_user,這是在沒有用戶登錄時使用的對象。

您還需要從某處獲取用戶。在g中存儲用戶名沒有任何意義,因爲您可以使用current_user.username。

如果你想獲得你需要太

if current_user.is_authenticated(): 
    g.user = current_user.username 

這就要求用戶對象有一個名爲username屬性的用戶名。有很多的方式來定製燒瓶登錄使用

我建議重新閱讀文檔和考慮看看源代碼:

https://github.com/maxcountryman/flask-login/blob/master/flask_login.py

+0

在最新版本的flask登錄中,'is_authenticated'被轉換爲一個bool變量。所以正確的版本是current_user。is_authenticated:g_user = current_user.get_id() – Pradheep

6

好了,錯誤信息說完這一切。沒有登錄的用戶,所以current_user返回AnonymousUserMixinAnonymousUserMixin實現此處描述的接口:http://flask-login.readthedocs.org/en/latest/#your-user-class(其中不包括username屬性)。嘗試是這樣的:

@pot.before_request 
def load_users(): 
    if current_user.is_authenticated(): 
     g.user = current_user.get_id() # return username in get_id() 
    else: 
     g.user = None # or 'some fake value', whatever 

顯然,你的代碼的其餘部分必須處理與g.user將不是指真正的用戶的可能性。