Django: ingelogde gebruikers omleiden vanaf de inlogpagina

Ik wil mijn site zo instellen dat als een gebruiker op de /login-pagina komt en deze al is ingelogd, deze naar de startpagina zal worden omgeleid. Als ze niet zijn ingelogd, wordt het normaal weergegeven. Hoe kan ik dit doen aangezien de inlogcode in Django is ingebouwd?


Antwoord 1, autoriteit 100%

Ik neem aan dat u momenteel de ingebouwde aanmeldingsweergave gebruikt, met

(r'^accounts/login/$', 'django.contrib.auth.views.login'),

of iets dergelijks in uw URL’s.

U kunt uw eigen aanmeldingsweergave schrijven die de standaardweergave omhult. Het zal controleren of de gebruiker al is ingelogd en omleiden als hij dat is, en anders de standaardweergave gebruiken.

zoiets als:

from django.contrib.auth.views import login
def custom_login(request):
    if request.user.is_authenticated():
        return HttpResponseRedirect(...)
    else:
        return login(request)

en verander natuurlijk uw url’s dienovereenkomstig:

(r'^accounts/login/$', custom_login),

Antwoord 2, autoriteit 78%

De Django 1.10 manier

Voor Django 1.10, uitgebracht in augustus 2016, is een nieuwe parameter met de naam redirect_authenticated_usertoegevoegd aan de functieweergave login()die aanwezig is in django.contrib.auth[1].

Voorbeeld

Stel dat we een Django-toepassing hebben met een bestand met de naam views.pyen een ander bestand met de naam urls.py. Het bestand urls.pybevat een aantal Python-code zoals deze:

#
# Django 1.10 way
#
from django.contrib.auth import views as auth_views
from . import views as app_views
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^login/', auth_views.login, name='login',
        kwargs={'redirect_authenticated_user': True}),
    url(r'^dashboard/', app_views.Dashboard.as_view(), name='dashboard'),
    url(r'^$', TemplateView.as_view(template_name='index.html'), name='index'),
]

Van dat bestand is het relevante deel binnen de variabeledefinitie urlpatternshet volgende, dat de al genoemde parameter redirect_authenticated_usergebruikt met een Truewaarde:

   url(r'^login/', auth_views.login, name='login',
        kwargs={'redirect_authenticated_user': True}),

Houd er rekening mee dat de standaardwaarde van de parameter redirect_authenticated_userFalseis.

De Django 1.11-manier

Voor Django 1.11, uitgebracht in april 2017, verving de LoginViewklasse-gebaseerde weergave de login()functie-gebaseerde weergave [2], waardoor je twee opties hebt om te kiezen van:

  • Gebruik dezelfde Django 1.10-manierdie zojuist is beschreven, wat positief is omdat je huidige code goed blijft werken. Als je de Python-interpreter vertelt om waarschuwingen weer te geven, door bijvoorbeeld in een consoleterminal het commando python -Wd manage.py runserveruit te voeren in je Django-projectdirectory en dan met een webbrowser naar je inlogpagina te gaan, je zou in diezelfde console-terminal een waarschuwingsbericht als dit zien:

/usr/local/lib/python3.6/site-packages/django/contrib/auth/views.py:54:
RemovedInDjango21Waarschuwing: De login()-weergave wordt vervangen door de
op klassen gebaseerde LoginView().

  • Gebruik de nieuwe Django 1.11 way, die je code moderner en compatibeler maakt met toekomstige Django-releases. Met deze optie ziet het eerder gegeven voorbeeld er nu als volgt uit:

Voorbeeld

We veronderstellen opnieuw dat we een Django-toepassing hebben met een bestand met de naam views.pyen een ander bestand met de naam urls.py. Het bestand urls.pybevat een aantal Python-code zoals deze:

#
# Django 1.11 way
#
from django.contrib.auth import views as auth_views
from . import views as app_views
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^login/',
        auth_views.LoginView.as_view(redirect_authenticated_user=True),
        name='login'),
    url(r'^dashboard/', app_views.Dashboard.as_view(), name='dashboard'),
    url(r'^$', TemplateView.as_view(template_name='index.html'), name='index'),
]

Van dat bestand is het relevante deel binnen de variabeledefinitie urlpatternshet volgende, dat opnieuw de reeds genoemde parameter redirect_authenticated_usergebruikt met een Truewaarde, maar als argument doorgeven aan de as_viewmethode van de LoginViewklasse:

   url(r'^login/',
        auth_views.LoginView.as_view(redirect_authenticated_user=False),
        name='login'),

Houd er rekening mee dat hier de standaardwaarde van de parameter redirect_authenticated_userook Falseis.

Referenties


Antwoord 3, autoriteit 31%

anonymous_required decorateur

Voor op klassen gebaseerde weergaven

Code:

from django.shortcuts import redirect
def anonymous_required(func):
    def as_view(request, *args, **kwargs):
        redirect_to = kwargs.get('next', settings.LOGIN_REDIRECT_URL )
        if request.user.is_authenticated():
            return redirect(redirect_to)
        response = func(request, *args, **kwargs)
        return response
    return as_view

Gebruik:

url(r'^/?$',
   anonymous_required(auth_views.login),
),
url(r'^register/?$',
    anonymous_required(RegistrationView.as_view()),
    name='auth.views.register'
),
# Could be used to decorate the dispatch function of the view instead of the url

Voor weergavefuncties

Van http://blog.motane.lu/2010/ 01/06/django-anonymous_required-decorator/

Code:

from django.http import HttpResponseRedirect
def anonymous_required( view_function, redirect_to = None ):
    return AnonymousRequired( view_function, redirect_to )
class AnonymousRequired( object ):
    def __init__( self, view_function, redirect_to ):
        if redirect_to is None:
            from django.conf import settings
            redirect_to = settings.LOGIN_REDIRECT_URL
        self.view_function = view_function
        self.redirect_to = redirect_to
    def __call__( self, request, *args, **kwargs ):
        if request.user is not None and request.user.is_authenticated():
            return HttpResponseRedirect( self.redirect_to )
        return self.view_function( request, *args, **kwargs )

Gebruik:

@anonymous_required
def my_view( request ):
    return render_to_response( 'my-view.html' )

Antwoord 4, autoriteit 28%

Voor Django 2.x, in uw urls.py:

from django.contrib.auth import views as auth_views
from django.urls import path
urlpatterns = [
    path('login/', auth_views.LoginView.as_view(redirect_authenticated_user=True), name='login'),
]

Other episodes