2016-12-16 59 views
0

我有一個Django應用程序,用戶可以使用Django的內置身份驗證系統登錄/註銷。我沒有在後端使用任何會話概念來爲登錄用戶維護不同的會話。如何註銷所有瀏覽器,如果我在Django的一個瀏覽器中註銷?

我在自定義模型中使用單個字段來存儲登錄/註銷狀態。

現在,如果有任何用戶從2個不同的瀏覽器登錄,login_state將爲true。如果用戶現在從一個瀏覽器註銷,那麼他/她的login_state將被設置爲False。

什麼是Django的方式,使他/她也從其他瀏覽器註銷也自動?我的意思是將他/她自動重定向到所有其他瀏覽器的登錄頁面?

PS:即使刷新其他瀏覽器的頁面後,也不會重定向到登錄頁面。我在視圖上使用了login_required裝飾器,以便流可以重定向到登錄頁面。如果用戶未經身份驗證,我正在使用settings.py中的LOGIN_URL重定向到登錄頁面。

+0

這無疑解決了自己,因爲你進入下一個頁面,用戶有一個錯誤的登錄狀態 – Sayse

回答

0

我建議覆蓋login_required裝飾器來檢查login_state。如果login_state爲true,則正常執行其他註銷用戶會話並重定向到登錄頁面。

請按照下面的代碼。我用它來定製login_required行爲。

def custom_user_passes_test(test_func, login_url=None, 
          redirect_field_name=REDIRECT_FIELD_NAME): 
    """ 
    Decorator for views that checks that the user passes the given test, 
    redirecting to the log-in page if necessary. The test should be a callable 
    that takes the user object and returns True if the user passes. 
    """ 

    def decorator(view_func): 
     @wraps(view_func, assigned=available_attrs(view_func)) 
     def _wrapped_view(request, *args, **kwargs): 
      if test_func(request.user): 
       #get current login_state and store in variable named login_state 
       if login_state: 
        return view_func(request, *args, **kwargs) 
       else: 
        return redirect_to_login(path, resolved_login_url, 
            redirect_field_name) 
     return _wrapped_view 
    return decorator 

def login_required(function=None, redirect_field_name=REDIRECT_FIELD_NAME, 
        login_url=None): 
    """ 
    Decorator for views that checks that the user is logged in, redirecting 
    to the log-in page if necessary. 
    """ 
    actual_decorator = custom_user_passes_test(lambda u: u.is_authenticated(), 
               login_url=login_url, 
               redirect_field_name=\ 
               redirect_field_name) 
    if function: 
     return actual_decorator(function) 
    return actual_decorator 
+0

我猜Django的身份驗證應用程序也使用相同的login_required方法定義重定向如果用戶退出登錄頁面。那麼爲什麼你爲login_reqiured定義了自己的定義? –

+0

我在用戶登錄時在會話中存儲了一些信息,這是正確運行應用程序所必需的。所以我檢查了每個請求,如果會話數據是否緩和,是否重定向用戶再次登錄。 – Darshit

+0

你的情況你可以檢查login_state。 – Darshit

相關問題