2013-09-01 12 views
9

Obecnie używam tych wzorców, aby zalogować się i obecniePrzekierowanie, jeśli jesteś już zalogowany poprzez adresy URL 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'}) 
) 

pomimo posiadania LOGIN_REDIRECT_URL = „/ profile /” w moim settings.py Django nie wyśle ​​mnie do/profile/jeśli chcę, aby uzyskać dostęp/zaloguj się/gdy jestem już zalogowany ...

Czy mogę w jakiś sposób przekierować wzorce adresów URL systemu auth? Nie chcę pisać do tego niestandardowego widoku.

Odpowiedz

21

używam czegoś takiego w moim 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

to całkiem fajne! Dzięki za ten fragment – Jurudocs

+1

+1 Działa perfekcyjnie, wolę używać nazwy mojego adresu URL w przypadku zmiany moich ścieżek, zmieniłem odpowiedź nieco 'login_forbidden = user_passes_test (lambda u: u.is_anonymous(), lazy (reverse, str) ('moje -url-name ')) ' – shabeer90

+0

Możesz pozbyć się parametru adresu URL'? next', ustawiając 'redirect_field_name = None' (Patrz [Usuń? następny] (http://stackoverflow.com/a/12764484/2228912)). Ten parametr pojawia się w adresie URL po przekierowaniu użytkownika (np. Jeśli jest w tym przypadku uwierzytelniony). – h4k1m

1

Co powiesz na jazdę w widoku Django login?

Następnie dodać ten mały kawałek kodu w tym widoku:

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

Jeśli chcesz zrobić coś innego w samej matrycy dla użytkownika rejestrze:

{% if user.is_authenticated %} 
1

Patrząc na source code na Github , domyślny widok login dostarczony przez django.contrib.auth użyje tylko LOGIN_REDIRECT_URL, jeśli formularz logowania zostanie przesłany za pomocą żądania POST i nie ma parametru next. (Wspomina o tym także The docs).

Widok faktycznie nie sprawdza, czy jesteś już uwierzytelniony, czy też nie - tak, że już uwierzytelniony użytkownik, który trafi na stronę ze standardowym żądaniem GET, ponownie zobaczy formularz logowania - taki sam jak nieuwierzytelniony użytkownik.

Jeśli chcesz zachować inne zachowanie, polecam napisanie własnego widoku logowania.

2

skończyło się na piśmie dekorator do takiego zadania.

Należy pamiętać, że zrobiłem to szybko & brudne.

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) 
Powiązane problemy