2009-05-20 281 views
16

是否有在urls.py和views.py使用login_required裝飾有什麼區別? 如果我把這個行:login_required裝飾

url(r'^add/$', login_required(views.add_media), name = 'add_media_action') 

到urls.py我會達到同樣的效果在views.py裝飾add_media功能:

@login_required 
def add_media(request): 
    ... 

回答

29

在Python中,裝飾是一個函數,一個函數作爲參數,並返回一個裝飾函數。如果您手動應用裝飾(如在你的第一個片段),它應該產生同樣的效果

def add_media(request): 
    ... 
add_media = login_required(add_media) 

所以說:@login_required語法可以翻譯成。

在您的第一個片段的方法,如果你想使用這兩種視圖的裝飾和未修飾的版本是非常有用的。

+9

+1特別是注意在最後一句。 – 2009-05-21 02:12:00

3

是的,他們是相同的。裝飾者是用於在另一個包裝功能的語法糖。因此,在這兩種情況下,你是纏繞views.add_medialogin_required

8

正如其他人所指出的那樣,他們確實是等價的。兩個額外的事情要考慮,如果你想要採取這種做法:

  1. 在urls.py做這休妻從那裏正在裝修的東西定義代碼的地方登錄要求。因此,您(或其他維護人員)可能會忘記該功能已被修飾。

  2. 由於您在URL文件中應用安全性,有人可能會錯誤地添加指向相同功能的另一個URL,但忘記將函數包含在login_required中,從而導致安全漏洞。

希望有所幫助。

相關問題