2009-05-20 22 views
16

¿Existe alguna diferencia en el uso del decorador de login_required en urls.py y en views.py? Si pongo esta línea:decodificador de login_required en django

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

en urls.py voy a lograr el mismo efecto que la decoración add_media función en views.py:

@login_required 
def add_media(request): 
    ... 

Respuesta

29

En Python, un decorador es una función que toma una función como argumento, y devuelve una función decorada. La sintaxis @login_required puede ser traducido a:

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

Así que si se aplica el decorador de forma manual (como en el primer fragmento), que debe generar el mismo efecto.

El enfoque en su primer fragmento es útil si desea usar las versiones decoradas y sin decoración de su vista.

+9

+1 particularmente para la nota en la última oración. –

3

Sí, son lo mismo. Los decoradores son azúcar sintáctico para envolver una función en otra. Entonces, en cualquier caso, está ajustando login_required alrededor de views.add_media.

8

Como han señalado otros, de hecho son equivalentes. Dos cosas adicionales a tener en cuenta si desea adoptar este enfoque:

  1. Hacerlo en el urls.py divorcia el requisito de inicio de sesión desde el lugar en el código donde se define la cosa de ser decorado. Debido a esto, usted (u otros mantenedores) puede olvidar que la función ha sido decorada.

  2. Dado que está aplicando seguridad en el archivo urls, es posible que alguien agregue erróneamente otra URL que apunta a la misma función, pero se olvide de ajustar la función en login_required, lo que lleva a un agujero de seguridad.

Espero que ayude.

Cuestiones relacionadas