簡體   English   中英

Django自動注銷未在數據庫中更新

[英]Django auto logout not updating in Database

我正在使用Python(2.7)和Django(1.11)開發一個項目,需要在其中執行幾分鍾或幾小時的不活動狀態自動注銷。

注意:我進行了很多搜索,並研究了一個相關的問題,但找不到針對我特定問題的任何解決方案,請不要將其標記為重復項!

我通過在settings.py添加一些設置來實現此目的:

SESSION_COOKIE_AGE = 120
SESSION_SAVE_EVERY_REQUEST = True
LOGOUT_REDIRECT_URL = 'mainlogin'

僅出於測試目的,我將其設置為2分鍾。 2分鍾后,當我刷新頁面時,用戶將注銷並重定向到登錄頁面,但是在后端/數據庫中,用戶的狀態仍active

我需要使用活動用戶進行進一步的處理/執行,因此,如果自動注銷的用戶不應該是活動用戶,則應該是活動用戶。

如果我手動注銷該用戶,它將不再顯示在活動用戶中,這意味着手動注銷運行良好,但是自動注銷仍將用戶顯示為active用戶。

這是我如何獲得活躍用戶的方法:

all_active_users = user_table.objects.filter(user_type='a', status=1, approval_status=1, is_active=True)
# further execution

更新:我正在使用名為user_table用戶的自定義模式,這是我根據答案的建議嘗試的方法:

def get_all_logged_in_users():
    # Query all non-expired sessions
    # use timezone.now() instead of datetime.now() in latest versions of Django
    sessions = Session.objects.filter(expire_date__gte=timezone.now())
    uid_list = []

    # Build a list of user ids from that query
    for session in sessions:
        data = session.get_decoded()
        uid_list.append(data.get('id', None))

    # Query all logged in users based on id list
    return user_table.objects.filter(id__in=uid_list)

它返回空查詢集為: active drivers are: <QuerySet []>甚至driver類型的用戶也已登錄。

如何解決此問題,所以當用戶自動注銷時,它將不會顯示在active用戶中。

您誤解了is_active的含義。 Django使用此字段來確定是否允許用戶登錄,而不是確定用戶當時是否登錄。

即使您想創建自己的“ User字段來存儲此信息,也很難做到,因為會話會隨着時間的流逝而過期。 服務器上實際上沒有發生任何可能觸發模型字段更改的事件。

因此,如果需要確定所有登錄用戶,則需要使用會話存儲。 Django沒有提供直接的方法來做到這一點,但是肯定是可能的。 此答案顯示了如何查詢Session表以查明誰已登錄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM