Benutzersystem — Registrieren, Anmelden, Abmelden

In diesem Kapitel lernst du, das integrierte Authentifizierungssystem von Django zu verwenden, um Benutzerregistrierung, Anmeldung und Abmeldung zu implementieren.


Djangos integriertes Authentifizierungssystem

Django bringt ein vollständiges Benutzerauthentifizierungsmodul mit:

  • IntegriertUserModelle (Benutzername, Passwort, E-Mail usw.)
  • Integrierte Login-/Logout-Views (Logik muss nicht selbst geschrieben werden)
  • Integrierte Berechtigungen und Gruppenverwaltung
  • Formularvalidierung und Sicherheitsvorkehrungen (CSRF, XSS)

Dieses Modul istdjango.contrib.authEs ist standardmäßig in INSTALLED_APPS registriert, wenn das Projekt erstellt wird.


Registrierungsseite

Django bietet integrierte Login-/Logout-Views, aber keine integrierte Registrierungs-View, daher müssen wir sie selbst schreiben.

Schritt 1: Registrierungsformular erstellen

Beispiel

# Dateipfad: blog/forms.py (neue Datei)
from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import Benutzer

class RegisterForm(UserCreationForm):
    Benutzerdefiniertes Registrierungsformular: von UserCreationForm erben, E-Mail-Feld hinzufügen
    email = forms.EmailField(
        label=E-Mail,
        required=True,
        help_text=Bitte geben Sie eine gültige E-Mail-Adresse ein.
    )

    class Meta:
        model = User
        fields = ['username', 'email', 'password1', 'password2']
        labels = {
            'username': Benutzername,
        }

Schritt 2: Registrierungsansicht schreiben

Beispiel

# Dateipfad: blog/views.py (neu hinzugefügt)
from django.shortcuts import render, redirect
from django.contrib.auth import login
from django.contrib import messages
from .forms import RegisterForm

def register(request):
    """Ansicht zur Benutzerregistrierung"""
    # Wenn der Benutzer bereits angemeldet ist, direkt zur Startseite weiterleiten.
    if request.user.is_authenticated:
        return redirect('index')

    if request.method == 'POST':
        # Benutzer hat das Registrierungsformular übermittelt
        form = RegisterForm(request.POST)
        if form.is_valid():
            user = form.save()              # Benutzer in der Datenbank speichern
            login(request, user)            # Nach der Registrierung automatisch anmelden
            messages.success(request, fRegistrierung erfolgreich, willkommen, {user.username}!)
            return redirect('index')
    else:
        # GET-Anfrage: Zeigt ein leeres Registrierungsformular an
        form = RegisterForm()

    return render(request, 'blog/register.html', {
        'form': form,
        'title': 'Registrieren - EXAMPLE Blog'
    })

DjangosmessagesDieses Framework wird verwendet, um einmalige Nachrichten zwischen Anfragen weiterzugeben (wie "Registrierung erfolgreich"). Durch das Rendern des Nachrichtenbereichs im Template können Benutzer Rückmeldungen zu Vorgängen sehen. Es funktioniert mit der Session, und die Nachricht verschwindet automatisch, nachdem sie einmal angezeigt wurde.


Login und Logout

Django bietet integrierte Login- und Logout-Views; Sie müssen sie nur in der URL-Konfiguration einbinden.

Beispiel

# Dateipfad: blog/urls.py
from django.urls import path
from django.contrib.auth import views as auth_views
from . import views

urlpatterns = [
    path('', views.index, name='index'),
    path('post/<int:pk>/', views.post_detail, name='post_detail'),
    path('register/', views.register, name='register'),

    # Die in Django eingebaute Login-Ansicht
    # template_name: gibt an, welches Template verwendet werden soll
    path('login/', auth_views.LoginView.as_view(
        template_name='blog/login.html',
        redirect_authenticated_user=True  # Eingeloggte Benutzer, die die Login-Seite aufrufen, werden direkt weitergeleitet.
    ), name='login'),

    # Die in Django eingebaute Logout-Ansicht
    path('logout/', auth_views.LogoutView.as_view(), name='logout'),
]

Konfigurieren Sie die Weiterleitungsadressen für Anmeldung und Abmeldung in settings.py:

Beispiel

# Dateipfad: am Ende von blog_project/settings.py hinzufügen
LOGIN_URL = 'login'                    # Nicht authentifizierte Benutzer, die auf geschützte Seiten zugreifen, werden auf die Anmeldeseite weitergeleitet.
LOGIN_REDIRECT_URL = 'index'           # Nach erfolgreicher Anmeldung zur Startseite weiterleiten
LOGOUT_REDIRECT_URL = 'index'          # Nach Abmeldung zur Startseite weiterleiten

Authentifizierungsbezogene Vorlagen erstellen

Anmelde-Vorlage

Beispiel

<!-- Dateipfad: blog/templates/blog/login.html -->
{% extends 'blog/base.html' %}

{% block title %}Anmeldung - EXAMPLE Blog{% endblock %}

{% block content %}
<div class="auth-form">
    <h2>Anmelden</h2>
    <form method="post">
        {% csrf_token %}
        <div class="form-group">
            <label>Benutzername</label>
            {{ form.username }}
        </div>
        <div class="form-group">
            <label>Passwort</label>
            {{ form.password }}
        </div>
        {% if form.errors %}
            <p class="error-msg">Falscher Benutzername oder falsches Passwort, bitte versuchen Sie es erneut.</p>
        {% endif %}
        <button type="submit" class="btn-submit">Anmelden</button>
    </Form>
    <p class="form-footer">
Noch kein Konto?<a href="{% url 'register' %}">Jetzt registrieren</a>
    </p>
</div>
{% endblock %}

Registrierungsvorlage

Beispiel

<!-- Dateipfad: blog/templates/blog/register.html -->
{% extends 'blog/base.html' %}

{% block title %}Registrieren - EXAMPLE Blog{% endblock %}

{% block content %}
<div class="auth-form">
    <h2>Register</h2>
    <form method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit" class="btn-submit">Registrieren</button>
    </Form>
    <p class="form-footer">
Haben Sie bereits ein Konto?<a href="{% url 'login' %}">Jetzt anmelden</a>
    </p>
</div>
{% endblock %}

{% csrf_token %}Dies ist Djangos Sicherheitsmechanismus zum Schutz vor Cross-Site-Request-Forgery-Angriffen. Jedes POST-Formular muss es enthalten, andernfalls lehnt Django die Anfrage ab (403-Fehler). Dieses Tag erzeugt ein verstecktes Eingabefeld, das ein zufälliges CSRF-Token enthält.


Anmeldestatus in der Navigationsleiste anzeigen

Aktualisiere die Navigationsleiste in base.html, um abhängig vom Anmeldestatus unterschiedliche Inhalte anzuzeigen.

Beispiel

<!-- Den Navigationsleisten-Abschnitt von blog/templates/blog/base.html ändern -->
<header class="navbar">
    <a href="/" class="logo">BEISPIEL Blog</a>
    <nav>
        <a href="/">Startseite</a>

        {% if user.is_authenticated %}
{# Angemeldet: Benutzername und Abmelden-Schaltfläche anzeigen (Benutzer wird automatisch von Django eingefügt) #}
            <span class="user-name">{{ user.username }}</span>
            <a href="{% url 'logout' %}">Abmelden</a>
        {% else %}
{# Nicht angemeldet: Anmelde- und Registrierungslinks anzeigen #}
            <a href="{% url 'login' %}">Anmelden</a>
            <a href="{% url 'register' %}">Registrieren</a>
        {% endif %}
    </nav>
</header>

Der Template-Kontext-Prozessor von Django wird automatisch{{ user }}es in jedes Template einfügen, ohne es manuell in views.py übergeben zu müssen. Du kannstuser.is_authenticatedErmittle, ob der Benutzer angemeldet ist.


Styling der Anmeldeseite

Beispiel

/* An den Stil in base.html anhängen */
.auth-form {
    max-width: 400px;
    margin: 40px auto;
    padding: 30px;
    background: #fff;
    border-radius: 12px;
    box-shadow: 0 2px 12px rgba(0,0,0,0.08);
}

.auth-form h2 {
    margin-bottom: 24px;
    text-align: center;
}

.auth-form .form-group {
    margin-bottom: 16px;
}

.auth-form label {
    display: block;
    margin-bottom: 6px;
    font-weight: 500;
}

.auth-form input {
    width: 100%;
    padding: 10px 12px;
    border: 1px solid #ddd;
    border-radius: 6px;
    font-size: 14px;
}

.btn-submit {
    width: 100%;
    padding: 12px;
    background: #2c3e50;
    color: #fff;
    border: none;
    border-radius: 6px;
    font-size: 16px;
    cursor: pointer;
    margin-top: 10px;
}

.error-msg {
    color: #e74c3c;
    font-size: 14px;
}

.form-footer {
    margin-top: 16px;
    text-align: center;
    font-size: 14px;
}

.user-name {
    color: #2c3e50;
    font-weight: 500;
}

Kapitelzusammenfassung

In diesem Kapitel haben Sie Djangos integriertes Authentifizierungssystem integriert: UserCreationForm geerbt, um das Registrierungsformular zu erstellen, LoginView/LogoutView verwendet, um Anmeldung/Abmeldung zu implementieren, csrf_token verwendet, um POST-Anfragen zu schützen, und user.is_authenticated in Vorlagen verwendet, um den Anmeldestatus zu überprüfen.

Jetzt hat der Blog einen vollständigen Ablauf für Benutzerregistrierung, Anmeldung und Abmeldung.

Weitere Erweiterungen