00
:
00
:
00
:
00
•Corso SEO AI - Usa SEOEMAIL al checkout per il 30% di sconto

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.