2012-03-01 257 views
6

根據https://stackoverflow.com/a/8715790/210481中的一條評論,我同意,如果一個依賴於其他裝飾器,我們應該避免使用多個裝飾器。Django:在其他裝飾器中重新使用login_required裝飾器

所以,在這個例子中,如果我們有一個裝飾器「active_required」用於活動用戶,我們不應該在同一個視圖上同時使用active_required和login_required。

我們應該有「login_required」裝飾器「調用」在「active_required」之內。

是否有可能使用django附帶的標準「login_required」裝飾器來完成它?

我的要求是: 1)如果用戶沒有通過驗證,我應該重定向他LOGIN_URL 2)如果用戶進行身份驗證(通過login_required),但不活躍,我要他重定向到一個頁面「重新激活」,他的帳戶 3)如果用戶進行身份驗證並激活,用戶可以訪問視圖提前

感謝

+0

因爲你想在3個可能的情況下有不同的行爲,有兩個裝飾看起來不錯 – second 2012-03-01 19:11:29

+0

正如我所說的,你只想用一個裝飾器而不是兩個做兩個不同的測試? – sergzach 2012-03-01 19:27:48

+0

我想要2個不同的行爲,但一個取決於另一個。 @ChrisPratt,當我想到這件事時,我在看你的評論。只有用戶名和密碼匹配時,標準登錄功能纔會檢查「活動」標誌。我可以考慮其他例子:在我的網站中,用戶可以創建列表,只有列表的所有者可以編輯列表,因此我需要檢查用戶是否已登錄,以及它是否爲列表的所有者。這只是另一個例子。 – duduklein 2012-03-01 20:42:41

回答

8

在考慮你的問題,我發現它更容易地創建一個簡單的active_required裝飾者第一。這很容易,因爲我們可以使用django.contrib.auth.decorators中的user_passes_test函數。

然後問題變成「我如何將login_requiredactive_required組合成一個裝飾器?」。我們需要定義一個函數:

  1. 需要一個瀏覽功能,因爲它的參數
  2. 既適用裝飾以它來創建一個新的視圖功能
  3. 回報新視圖功能

把這一切,你有以下幾點:

from django.contrib.auth.decorators import user_passes_test, login_required 

active_required = user_passes_test(lambda u: u.is_active, login_url=REACTIVATE_URL) 

def active_and_login_required(view_func): 
    decorated_view_func = login_required(active_required(view_func)) 
    return decorated_view_func