Login e Logout
Django fornisce viste, funzioni e decoratori pronti allâuso per gestire lâautenticazione degli utenti. In questa guida vedremo come implementare login, logout e proteggere le pagine riservate.
Configurazione delle URL
Django include viste predefinite per login e logout. Aggiungile al file urls.py:
# urls.py (progetto)
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('accounts/', include('django.contrib.auth.urls')),
]
Questo include automaticamente le seguenti URL:
/accounts/login/â pagina di login/accounts/logout/â logout/accounts/password_change/â cambio password/accounts/password_reset/â reset password
Impostazioni nel settings.py
Configura le URL di redirect dopo login e logout:
# settings.py
LOGIN_URL = '/accounts/login/'
LOGIN_REDIRECT_URL = '/' # dove andare dopo il login
LOGOUT_REDIRECT_URL = '/accounts/login/' # dove andare dopo il logout
Template per il Login
Crea il template per la pagina di login in templates/registration/login.html:
# templates/registration/login.html
# {% extends "base.html" %}
#
# {% block content %}
# <h2>Accedi</h2>
#
# {% if form.errors %}
# <div class="alert alert-danger">
# <p>Username o password non corretti.</p>
# </div>
# {% endif %}
#
# <form method="post">
# {% csrf_token %}
# {{ form.as_p }}
# <button type="submit">Accedi</button>
# </form>
# {% endblock %}
LoginView Personalizzata
Puoi personalizzare la vista di login usando LoginView:
# views.py
from django.contrib.auth.views import LoginView
class LoginPersonalizzata(LoginView):
template_name = 'accounts/login.html'
redirect_authenticated_user = True
extra_context = {'titolo': 'Accedi al Portale'}
# urls.py
from .views import LoginPersonalizzata
urlpatterns = [
path('login/', LoginPersonalizzata.as_view(), name='login'),
]
LogoutView
Per il logout, puoi usare la vista predefinita o personalizzarla:
# urls.py
from django.contrib.auth.views import LogoutView
urlpatterns = [
path('logout/', LogoutView.as_view(next_page='/'), name='logout'),
]
Nel template, il logout si attiva tramite un form POST (in Django 5.x il logout via GET e deprecato):
# template
# <form method="post" action="{% url 'logout' %}">
# {% csrf_token %}
# <button type="submit">Esci</button>
# </form>
Funzioni authenticate, login e logout
Per un controllo piu granulare, puoi usare le funzioni di autenticazione direttamente:
from django.contrib.auth import authenticate, login, logout
from django.shortcuts import render, redirect
def vista_login(request):
if request.method == 'POST':
username = request.POST['username']
password = request.POST['password']
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
# Redirect alla pagina richiesta o alla home
next_url = request.GET.get('next', '/')
return redirect(next_url)
else:
return render(request, 'login.html', {
'errore': 'Credenziali non valide.'
})
return render(request, 'login.html')
def vista_logout(request):
logout(request)
return redirect('login')
Proteggere le Pagine con @login_required
Il decoratore @login_required impedisce lâaccesso alle pagine per utenti non autenticati:
from django.contrib.auth.decorators import login_required
@login_required
def dashboard(request):
return render(request, 'dashboard.html')
@login_required(login_url='/accedi/')
def profilo(request):
return render(request, 'profilo.html', {'utente': request.user})
Se lâutente non e autenticato, viene reindirizzato alla pagina di login con il parametro next che indica la pagina originale.
LoginRequiredMixin per Class-Based Views
Per le class-based views, usa LoginRequiredMixin:
from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic import TemplateView
class DashboardView(LoginRequiredMixin, TemplateView):
template_name = 'dashboard.html'
login_url = '/accounts/login/'
redirect_field_name = 'next'
LoginRequiredMixin deve essere il primo nella lista delle classi ereditate.
Verificare lâAutenticazione nei Template
Nei template puoi controllare se lâutente e autenticato:
# {% if user.is_authenticated %}
# <p>Benvenuto, {{ user.get_full_name|default:user.username }}!</p>
# <form method="post" action="{% url 'logout' %}">
# {% csrf_token %}
# <button type="submit">Esci</button>
# </form>
# {% else %}
# <a href="{% url 'login' %}">Accedi</a>
# {% endif %}
Conclusione
Django rende semplice implementare un sistema completo di login e logout. Le viste predefinite LoginView e LogoutView coprono la maggior parte dei casi dâuso, mentre le funzioni authenticate(), login() e logout() offrono il massimo controllo. Con il decoratore @login_required puoi proteggere facilmente le pagine riservate agli utenti autenticati.