我的問題是一般問題,但具體而言,我的應用程序是Django的login_required裝飾器。檢查一個函數是否有裝飾器
我很好奇,如果有一種方法來檢查,如果視圖/函數有一個特定的裝飾(在這種情況下login_required裝飾)
我出將用戶登錄後重定向,我想重定向如果它們當前所在的頁面具有login_required裝飾器,則返回主頁面。到目前爲止,我的搜索沒有結果。
我的問題是一般問題,但具體而言,我的應用程序是Django的login_required裝飾器。檢查一個函數是否有裝飾器
我很好奇,如果有一種方法來檢查,如果視圖/函數有一個特定的裝飾(在這種情況下login_required裝飾)
我出將用戶登錄後重定向,我想重定向如果它們當前所在的頁面具有login_required裝飾器,則返回主頁面。到目前爲止,我的搜索沒有結果。
建立你自己的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?
看來你的情況如下: 1.你有頁面是安全的,並在需要登錄的裝飾器後面 2.你具有不安全的頁面,並且可以以登錄狀態和匿名狀態訪問頁面。
如果我瞭解您的要求,您希望用戶在用戶註銷時重定向到主頁面(假設這是可以以登錄狀態和匿名狀態訪問的歡迎頁面)。
爲什麼不僅限制用戶只能從安全頁面註銷的能力,然後將註銷時的redirect_url設置爲歡迎屏幕?
+1:這是視圖功能的用途。註銷視圖函數可以使用'if request.user.is_anonymous()'來確定是否註銷某人,以及顯示哪個頁面。 – 2011-03-30 18:40:27
是的,但如果您嘗試將其註銷並將其重定向回註銷的頁面,則除非您知道該頁面/視圖是否使用身份驗證進行保護,否則這不起作用。 – 2011-05-25 12:34:27
「標記裝飾的功能」?爲什麼不用正確的URL名稱標記每個函數以在退出時重定向?這會更直接有用。 – 2011-03-30 17:41:54
@ S.Lott聽起來你的意思是將一個URL或一個URL名稱附加到視圖函數,我相信這將是一個不好的做法,因爲它會混合你的網站和視圖,它們在Django中明確分開。 – 2011-03-30 17:46:04
@Chris W .:在視圖中引用URL名稱,以便「reverse()」可以工作。同樣,URL模板中的URL名稱也是引用的,所以'{%url%}'將起作用。我不確定你的意思是「混合」。你能進一步解釋嗎? – 2011-03-30 17:49:44