2010-02-19 10 views
10

Necesito verificar la autorización del usuario en cada vista de una de mis aplicaciones Django (no uso el sistema de autenticación incorporado de Django) y redireccionar al usuario a una página de "inicio de sesión por favor", si la autorización ha fallado.¿Cómo ejecutar un fragmento de código en cada vista en django?

código es el siguiente:

try: 
    admin_from_session = request.session['admin']; 
    admin = Administrator.objects.get(login = admin_from_session.login, password = admin_from_session.password, enabled=True); 
except KeyError, Administrator.DoesNotExist: 
    return HttpResponseRedirect('/controlpanel/login') 

La pregunta es: ¿cómo puedo ejecutar este código al principio de cada punto de vista, sin tener que repetir cada vez?

Si me gustaría escribir mi programa en PHP, me gustaría poner este código en archivo separado y escribir algo como esto al principio de cada página que requiere de autorización:

include("redirect_if_not_logged_in.inc.php"); 

Las soluciones que encontré fue:

  • etiquetas de inclusión - no lo hacen, porque no puedo redirigir cualquier lugar desde allí
  • función personalizada - tampoco funciona, debido a la misma razón .

La tarea parece trivial, pero no puedo encontrar una solución. Estaría muy agradecido por cualquier ayuda.

+0

Almacenar la contraseña en la sesión no puede ser una buena idea. Aprende cómo usar el sistema de autenticación integrado. Para campos adicionales en sus usuarios, configure un modelo de perfil de usuario. –

Respuesta

6

Mira el source code for django.contrib.auth decorators. Hacen exactamente lo que usted desea, pero para el sistema de autenticación incorporado de Django (see the documentation). No debería ser difícil hacer algo similar para su sistema de autenticación.

Por cierto, ¿por qué no utiliza la autenticación incorporada? Se puede utilizar con backends de autenticación personalizados ...

+0

Gracias por su ayuda. No uso auth incorporado porque el mío requiere muchos campos personalizados y funcionalidad, y realmente no sé cómo hacer que el trabajo de auth funcione como lo necesito. Tal vez estoy demasiado acostumbrado a reescribir todas las cosas por mi cuenta, en lugar de usar el código de otras personas. Supongo que es un mal hábito :) –

+0

Usando un back-end de autenticación personalizado puede usar cualquier número de campos. Simplemente escriba una clase que implemente dos métodos: 1. authenticate() - credenciales de inicio de sesión dadas (podría ser cualquier cosa, no tiene que ser solo login y contraseña) las verifica y devuelve el objeto de usuario de la base de datos o None apropiadamente. 2. get_user() - el ID de usuario dado devuelve el objeto de usuario. Eso es todo. django.contrib.auth se jugará muy bien con otras partes de django (como admin) y, más importante, con las aplicaciones reutilizables de Django (que son uno de los puntos más fuertes de Django). –

+0

Documentación para escribir backends de autenticación personalizados: http://docs.djangoproject.com/en/dev/topics/auth/#writing-an-authentication-backend –

1

decoradores de función viene a la mente

+0

puede ser que signifique algo más? Anotaciones de función en python es una característica completamente no relacionada: http://www.python.org/dev/peps/pep-3107/ – SilentGhost

+0

Decorators. Lo siento – GabiMe

0

Tome un vistazo a la página de autenticación de usuario aquí http://docs.djangoproject.com/en/dev/topics/auth/

leyendo para "El decorador login_required".

from django.contrib.auth.decorators import login_required 

@login_required 
def my_view(request): 
    ... 

Usted puede configurar donde el usuario es redirigido a ser si no es autenticado mediante el ajuste "settings.LOGIN_URL".

En la página también hay un ejemplo para una plantilla de autenticación especial que puede darle estilo a cualquier cosa que quiera.

+0

No está utilizando el sistema de autenticación integrado, por lo que '@login_required 'no funcionará aquí. –

2

Encontré la respuesta que estaba buscando. Los decoradores de función permiten ejecutar una pausa de código al comienzo de una función.

Debe definir una función decoradora

def login_please_decorator(view_func): 
    """ 
     Redirect if admin was not logged in 
    """ 
    def _decorated(request, *args, **kwargs): 
     #Check authorization 
     try: 
      admin_from_session = request.session['admin']; 
      admin = Administrator.objects.get(login = admin_from_session.login, password = admin_from_session.password, enabled=True); 
      return view_func(request,*args, **kwargs); 
     except KeyError, Administrator.DoesNotExist: 
      return HttpResponseRedirect('/cp/login?ret=' + request.path); 

    return _decorated 

y decorar una vista usando este nombre de la función:

@login_please_decorator 
def some view(request): 
    # do something ... 
    # ... 

Ludwik Trammer, bugspy.net, gracias por su ayuda.

Cuestiones relacionadas