2013-09-01 10 views
9

Attualmente io uso questi modelli per accedere e uscireReindirizza se hai già effettuato l'accesso tramite gli URL di Django?

urlpatterns += patterns("", 
    (r'^login/$', 'django.contrib.auth.views.login', {'template_name': 'login.html'}), 
    (r'^logout/$', 'django.contrib.auth.views.logout', {'template_name': 'logout.html'}) 
) 

A dispetto di avere LOGIN_REDIRECT_URL = '/ profile /' nel mio settings.py, Django non mi ha mandato a/profile/se voglio l'accesso/login/quando ho già effettuato l'accesso ...

Posso in qualche modo reindirizzare i pattern URL del sistema di autenticazione? Sono riluttante a scrivere una visualizzazione personalizzata per questo.

risposta

21

uso qualcosa come questo nel mio urls.py:

from django.contrib.auth.views import login 
from django.contrib.auth.decorators import user_passes_test 


login_forbidden = user_passes_test(lambda u: u.is_anonymous(), '/') 

urlpatterns = patterns('', 
    url(r'^accounts/login/$', login_forbidden(login), name="login"), 
+0

che è piuttosto bello! Grazie per questo frammento – Jurudocs

+1

+1 Funzionato perfettamente, preferisco usare il mio nome url nel caso in cui i miei percorsi cambino, alterato la risposta un po 'login_forbidden = user_passes_test (lambda u: u.is_anonymous(), lazy (reverse, str) (' my -url-name ')) ' – shabeer90

+0

Puoi sbarazzarti del parametro'? next' url impostando 'redirect_field_name = None' (vedi [Remove? next] (http://stackoverflow.com/a/12764484/2228912)). Questo parametro viene visualizzato nell'URL dopo che l'utente viene reindirizzato (ad esempio se è autenticato in questo caso). – h4k1m

1

Come si monta la vista Django login?

Quindi aggiungere questo piccolo pezzo di codice in quella vista:

if request.user.is_authenticated(): 
     # Redirect to profile 

Se si vuole fare qualcosa di diverso nel modello stesso per l'utente registro:

{% if user.is_authenticated %} 
1

Guardando il source code su Github , la visualizzazione predefinita login fornita da django.contrib.auth utilizzerà solo LOGIN_REDIRECT_URL se il modulo di accesso viene inviato tramite una richiesta POST e non ha il parametro next. (Anche lo docs menziona questo).

La vista login non esegue alcuna verifica se sei già autenticato o meno, quindi un utente già autenticato che ha colpito la pagina con una richiesta standard GET vedrà di nuovo il modulo di accesso, proprio come un utente non autenticato.

Se si desidera un comportamento diverso, si consiglia di scrivere la propria vista di accesso.

2

ho finito per scrivere un decoratore per tale compito.

Si prega di prendere nota che ho reso veloce & sporco.

from django.conf import settings 
from django.shortcuts import redirect 


def redirect_if_logged(f=None, redirect_to_url=None): 
    u""" 
    Decorator for views that checks that the user is already logged in, redirecting 
    to certain URL if so. 
    """ 
    def _decorator(view_func): 
     def _wrapped_view(request, *args, **kwargs): 
      if request.user.is_authenticated(): 
       redirect_url = redirect_to_url 

       if redirect_to_url is None: 
        # URL has 'next' param? 
        redirect_url_1 = request.GET.get('next') 
        # If not, redirect to referer 
        redirect_url_2 = request.META.get('HTTP_REFERER') 
        # If none, redirect to default redirect URL 
        redirect_url_3 = settings.LOGIN_REDIRECT_URL 

        redirect_url = redirect_url_1 or redirect_url_2 or redirect_url_3 

       return redirect(redirect_url, *args, **kwargs) 
      else: 
       return view_func(request, *args, **kwargs) 
     return _wrapped_view 

    if f is None: 
     return _decorator 
    else: 
     return _decorator(f) 
Problemi correlati