Estoy tratando de decorar una vista de Django por dos decoradores, uno para verificar el inicio de sesión, y uno para verificar is_active.Múltiples decoradores para una vista en Django: orden de ejecución
La primera de ellas es la incorporada en @login_required
, y el segundo es el siguiente:
def active_required(function):
dec = user_passes_test(lambda u: u.is_active, '/notallowed', '')
return dec(function)
Ahora, los decoradores de trabajo Python adentro hacia afuera, sin embargo, el siguiente no funciona:
@active_required
@login_required
def foo(request):
...
Quiero comprobar primero si el usuario está conectado, y redireccionar a la página de inicio de sesión si no, y si él o ella está conectado, quiero comprobar si él o ella está activo, y si no, realizar la redirección a '/notallowed'
.
Lo que pasa es que si falla el login_required, el usuario no se redirige a la página de inicio de sesión, pero se ejecuta @active_required
, y ya que el usuario es nulo en ese caso, decorador @active_required falla y el usuario es redirigido a /notallowed
.
Cambiar el orden parece funcionar,
@login_required
@active_required
def foo(request):
...
pero sospecho que hay algo mal con este enfoque también.
¿Cuál es la forma correcta de combinar dos decoradores, y por qué el orden de ejecución difiere de los simples decoradores de Python?
Hmm, todavía estoy un poco confundido sobre el pedido: http://stackoverflow.com/a/739665/72436 y http://stackoverflow.com/a/8715839/72436 sugieren lo contrario. – ustun
OK, creo que lo has encontrado, la diferencia radica en devolver una función vs llamarla. – ustun