2014-01-15 72 views
3

我需要一些幫助來了解如何測試用戶當前是否登錄。我在網上搜索,發現有對視圖的方法解決方案,從請求拉出來的用戶,並對其進行測試:Django:如何測試用戶當前是否登錄

if request.user.is_authenticated(): 

然而,在我的情況,我需要像下面這樣:

user = User.objects.get(id=1) 
if user.is_logging_in(): 
    # do something 
else: 
    # do something else 

這是否類型的功能存在於Django中嗎?謝謝!

+0

你是指編寫單元測試嗎? –

+0

@YerayDiazDiaz:不是在這種情況下,但我可能需要它在未來的測試。 –

+0

我很好奇背後的用例是什麼?對於「已登錄」的編碼在典型的基於HTTP的客戶端 - 服務器應用程序中可能是一個具有挑戰性的概念。例如。 is_authenticated()告訴您請求用戶是否已通過身份驗證,但在請求到達服務器時,他們可能已關閉瀏覽器窗口。我之前有過同樣的問題,但意識到我正在尋找錯誤的東西。 –

回答

1

我不認爲該信息以受支持的方式存在。我的理解是,用戶認證系統使用SessionMiddleware來存儲會話是否具有與其關聯的已認證用戶。爲了澄清,當用戶登錄時,會話存儲數據,表明另一方的客戶端是用戶這樣那樣的。

你需要做的是遍歷所有的會話,並確定會話是否有關聯的用戶,如果是,那麼該用戶是誰。據我所知,無法遍歷會話,但我可能是錯的。

this answer我發現了一種可以達到同樣效果的方法。

from django.contrib.auth.signals import user_logged_in, user_logged_out 

def record_user_logged_in(sender, user, request, **kwargs): 
    # Record the user logged in 

def record_user_logged_out(sender, user, request, **kwargs): 
    # Record the user logged out 

user_logged_in.connect(record_user_logged_in) 
user_logged_out.connect(record_user_logged_out) 

我把它留給你爲如何存儲信息pertained到登錄/退出,但模式將是這樣做的一個很好的方式。我應該指出,我不認爲這涵蓋了用戶證書超時的情況(從會話超時)。

另外,我剛剛遇到了this answer其中鏈接here這是一個跟蹤活動用戶的項目。我不知道它增加了多少開銷,但只是想我會添加它。

+0

感謝您的答覆。我已經實現了該信號,並且我在數據庫中創建了一個字段,以便擁有一個記錄用戶登錄/註銷過程的計數器。不過,我有點擔心這個櫃檯出現問題。你能想到任何情況嗎?但是你的回答非常有道理,可能對其他人有幫助。會接受它。 –

+0

@da_zhuang那麼,我承認可能有一些邊緣情況,但如果您擔心邊緣情況,我認爲您需要對您認爲是「登錄用戶」的具體情況非常具體。如果有可能request.user.is_authenticated()將返回給特定用戶的True(當然,他們沒有第一次登錄),你是否考慮任何用戶登錄? – CrazyCasta

+0

那麼沒有那麼複雜:)。在與其他團隊成員討論後,我們決定實施強制用戶在5分鐘內不活動後退出。 –

相關問題