2011-03-30 42 views
13

我的問題是一般問題,但具體而言,我的應用程序是Django的login_required裝飾器。檢查一個函數是否有裝飾器

我很好奇,如果有一種方法來檢查,如果視圖/函數有一個特定的裝飾(在這種情況下login_required裝飾)

我出將用戶登錄後重定向,我想重定向如果它們當前所在的頁面具有login_required裝飾器,則返回主頁面。到目前爲止,我的搜索沒有結果。

回答

15

建立你自己的login_required裝飾,並將其標記爲裝飾功能 - 可能是標記它的最佳位置將在func_dict

from django.contrib.auth.decorators import login_required as django_l_r 

# Here you're defining your own decorator called `login_required` 
# it uses Django's built in `login_required` decorator 
def login_required(func): 
    decorated_func = django_l_r(func) 
    decorated_func.func_dict['login_is_required'] = True 
    return decorated_func 

@login_required # Your decorator 
def authenticatedd_view(request): 
    pass 

def unauthenticated_view(request): 
    pass 

現在你可以檢查,看看是否有一種觀點裝飾這樣的...

# Assume `a_view` is view function 
>>> a_view.func_dict.get('login_is_required',False) 

如果你感到困惑的Python裝修看到這個SO提問/回答:How to make a chain of function decorators?

+0

「標記裝飾的功能」?爲什麼不用正確的URL名稱標記每個函數以在退出時重定向?這會更直接有用。 – 2011-03-30 17:41:54

+0

@ S.Lott聽起來你的意思是將一個URL或一個URL名稱附加到視圖函數,我相信這將是一個不好的做法,因爲它會混合你的網站和視圖,它們在Django中明確分開。 – 2011-03-30 17:46:04

+0

@Chris W .:在視圖中引用URL名稱,以便「reverse()」可以工作。同樣,URL模板中的URL名稱也是引用的,所以'{%url%}'將起作用。我不確定你的意思是「混合」。你能進一步解釋嗎? – 2011-03-30 17:49:44

2

看來你的情況如下: 1.你有頁面是安全的,並在需要登錄的裝飾器後面 2.你具有不安全的頁面,並且可以以登錄狀態和匿名狀態訪問頁面。

如果我瞭解您的要求,您希望用戶在用戶註銷時重定向到主頁面(假設這是可以以登錄狀態和匿名狀態訪問的歡迎頁面)。

爲什麼不僅限制用戶只能從安全頁面註銷的能力,然後將註銷時的redirect_url設置爲歡迎屏幕?

+0

+1:這是視圖功能的用途。註銷視圖函數可以使用'if request.user.is_anonymous()'來確定是否註銷某人,以及顯示哪個頁面。 – 2011-03-30 18:40:27

+0

是的,但如果您嘗試將其註銷並將其重定向回註銷的頁面,則除非您知道該頁面/視圖是否使用身份驗證進行保護,否則這不起作用。 – 2011-05-25 12:34:27

相關問題