2011-03-30 18 views
13

Mi pregunta es general, pero específicamente mi aplicación es el decorador de login_required para Django.Compruebe si una función tiene un decorador

Tengo curiosidad por si hay una manera de comprobar si miras/función tiene un decorador específico (en este caso el decorador login_required)

estoy a redirigir después de acceder a un usuario, y quiero redireccionar a la página principal si la página en la que se encuentran actualmente tiene el decorador de login_required. Mis búsquedas no han dado resultados hasta el momento.

Respuesta

15

Construya su propio decorador login_required y haga que marque la función como decorado - probablemente el mejor lugar para marcarlo sería en el func_dict.

from django.contrib.auth.decorators import login_required as django_l_r 

# Here you're defining your own decorator called `login_required` 
# it uses Django's built in `login_required` decorator 
def login_required(func): 
    decorated_func = django_l_r(func) 
    decorated_func.func_dict['login_is_required'] = True 
    return decorated_func 

@login_required # Your decorator 
def authenticatedd_view(request): 
    pass 

def unauthenticated_view(request): 
    pass 

Ahora se puede comprobar para ver si un punto de vista fue decorado como este ...

# Assume `a_view` is view function 
>>> a_view.func_dict.get('login_is_required',False) 

Si usted está confundido acerca de decoradores de Python ver este SO pregunta/respuesta: How to make a chain of function decorators?

+0

"marque la función como decorado"? ¿Por qué no marcar cada función con el nombre URL correcto para redirigir al cerrar la sesión? Eso sería más directamente útil. –

+0

@ S.Lott Parece que quiere decir adjuntar una URL o un nombre de URL a la función de vista, creo que sería una mala práctica, ya que sería mezclar sus URL y vistas, que están expresamente separadas en Django. –

+0

@Chris W .: Los nombres de las URL se referencian en vistas para que 'reverse()' funcione. De manera similar, los nombres de URL son referencia en las plantillas para que '{% url%}' funcione. No estoy seguro de lo que quieres decir con "mezclar". ¿Puedes explicar más? –

2

Parece que su situación es la siguiente: 1. Tiene páginas que están protegidas y detrás de un decorador requerido para iniciar sesión 2. Usted tienen páginas que no son seguras y se pueden visitar tanto en estado anotado como anónimo.

Si entiendo sus requisitos, quiere que un usuario sea redirigido a la Página principal (suponiendo que esta sea la página de bienvenida que se puede visitar tanto en un estado anotado como anónimo) cuando un usuario cierra la sesión.

¿Por qué no limitaría la capacidad del usuario para desconectarse solo de páginas seguras, y luego configuraría su redirect_url al cerrar sesión en la pantalla de bienvenida?

+0

+1: Para eso están las funciones de visualización. Una función de vista de cierre de sesión puede usar 'if request.user.is_anonymous()' para determinar si se registra o no a alguien y qué página mostrar. –

+0

Sí, pero si intenta cerrar sesión y redirigirlos a la página desde la que se cerraron la sesión, esto no funciona a menos que sepa si esa página/vista está protegida con autenticación. –

Cuestiones relacionadas