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_user
toegevoegd 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.py
en een ander bestand met de naam urls.py
. Het bestand urls.py
bevat 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 urlpatterns
het volgende, dat de al genoemde parameter redirect_authenticated_user
gebruikt met een True
waarde:
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_user
False
is.
De Django 1.11-manier
Voor Django 1.11, uitgebracht in april 2017, verving de LoginView
klasse-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 runserver
uit 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.py
en een ander bestand met de naam urls.py
. Het bestand urls.py
bevat 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 urlpatterns
het volgende, dat opnieuw de reeds genoemde parameter redirect_authenticated_user
gebruikt met een True
waarde, maar als argument doorgeven aan de as_view
methode van de LoginView
klasse:
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_user
ook False
is.
Referenties
- [1] Relevante sectie in Django 1.10 release-opmerkingen op https://docs.djangoproject.com/en/dev/releases/1.10/#django-contrib-auth
- [2] Relevante sectie in Django 1.11 release notes op https://docs.djangoproject.com/en/1.11/releases/1.11/#django-contrib-auth
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'),
]