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:
- Integriert
UserModelle (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
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
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'
})
Djangos
messagesDieses 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
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
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
{% 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
{% 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
<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
.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