2009-05-20 14 views
16

Czy jest jakaś różnica w używaniu decoratora login_required w urls.py iw views.py? Jeśli mogę umieścić ten wiersz:login_required decorator w django

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

do urls.py będę osiągnąć ten sam efekt, jak dekorowanie add_media funkcję w views.py:

@login_required 
def add_media(request): 
    ... 

Odpowiedz

29

w Pythonie, dekorator to funkcja, która trwa funkcja jako argument i zwraca udekorowaną funkcję. Składnia @login_required można przełożyć do:

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

więc jeśli zastosuje dekorator ręcznie (jak w pierwszym fragmencie), powinien on generować ten sam efekt.

Podejście w Twoim pierwszym fragmencie jest przydatne, jeśli chcesz użyć zarówno dekorowanych, jak i nieoszklonych wersji swojego widoku.

+9

+1 szczególnie w przypadku uwagi w ostatnim zdaniu. –

3

Tak, są takie same. Dekoratory to cukier syntaktyczny do zawijania funkcji w innym. Tak więc w obu przypadkach pakujesz login_required około views.add_media.

8

Jak inni podkreślili, są one w rzeczywistości równoważne. Dwa dodatkowe rzeczy do rozważenia, jeśli chcesz skorzystać z tej metody:

  1. Robi to w urls.py rozwodzi wymóg logowania z miejsca w kodzie, gdzie sprawa jest urządzony jest zdefiniowana. Z tego powodu ty (lub inni opiekunowie) możecie zapomnieć, że funkcja została udekorowana.

  2. Ponieważ stosujesz zabezpieczenia w pliku URL, możliwe jest, że ktoś błędnie dodaje inny adres URL, który wskazuje na tę samą funkcję, ale zapomnij zawinąć funkcję w login_required, co prowadzi do luki w zabezpieczeniach.

Nadzieję, że pomaga.

Powiązane problemy