Der folgende Artikel ist die 7. Folge der Django Klassebasierten Ansicht (CBV) Erkundungsreihe, in der beschrieben wird, wie man Mixin nutzt, um gemeinsame Funktionen wiederzuverwenden und Berechtigungsverwaltung sowie Login-Überprüfungen effektiv umzusetzen. In dem vorherigen Beitrag (6. Folge) haben wir mit TemplateView
und RedirectView
die einfache Seitenrendierung und Umleitung automatisiert. Jetzt werden wir lernen, wie wir die Wiederverwendbarkeit und Erweiterbarkeit von CBV maximieren können.
Der Link zum vorherigen Beitrag finden Sie hier!
Wie man TemplateView & RedirectView nutzt
„Steigern Sie die Wiederverwendbarkeit des Codes mit Django Mixin und setzen Sie einfach Berechtigungs- und Login-Prüfungen um!“
1. Mixin, warum ist es notwendig?
Django CBV bietet von sich aus eine starke Wiederverwendbarkeit. Aber was ist, wenn es mehrere gemeinsame Funktionen gibt, die in verschiedenen Ansichten benötigt werden? Zum Beispiel ist es oft erforderlich, dass man eingeloggt sein muss, um auf bestimmte Seiten zugreifen zu können, oder dass nur Benutzer mit bestimmten Rechten Zugang haben. An dieser Stelle kommt das Konzept des Mixin ins Spiel.
Mixin nutzt das Konzept der mehrfachen Vererbung, um gleiche Methoden oder Eigenschaften in mehrere Klassen einzufügen. In Django CBV können Sie durch die Vererbung von Mixin-Klassen, die bestimmte Funktionen implementieren, den Code-Duplikat reduzieren und die Wartbarkeit erhöhen.
Beispiele für die Nutzung von Mixin:
- Berechtigungsverwaltung: Überprüfung, ob der Benutzer, der auf eine bestimmte Ansicht zugreift, eingeloggt ist oder über bestimmte Rechte verfügt.
- Formularverarbeitungslogik: Vor- oder Nachbearbeitung von Daten, die in mehreren Formularen benötigt werden.
- Template-Kontext: Hinzufügen von Kontextdaten, die allen Ansichten gemeinsam übergeben werden müssen.
- Logging: Hinzufügen von Logging-Funktionen vor und nach der Ausführung einer bestimmten Ansicht.
2. Beispiel für die Nutzung von Mixin in Django: LoginRequiredMixin
Eines der am häufigsten verwendeten Mixins ist LoginRequiredMixin
. Wie der Name schon sagt, erzwingt es, dass eine Anmeldung erforderlich ist, um auf die betreffende Ansicht zuzugreifen.
2.1 Verwendung von LoginRequiredMixin
LoginRequiredMixin
ist im Modul django.contrib.auth.mixins
enthalten.
# views.py
from django.views.generic import ListView
from django.contrib.auth.mixins import LoginRequiredMixin
from .models import Post # Beispielmodell
class MyPostListView(LoginRequiredMixin, ListView):
model = Post
template_name = 'posts/my_posts.html'
context_object_name = 'posts'
# URL, zu der umgeleitet wird, wenn nicht eingeloggte Benutzer zugreifen (optional)
# login_url = '/accounts/login/' # settings.LOGIN_URL ist der Standardwert
# redirect_field_name = 'next' # Name des Query-Parameters, das verwendet wird, um nach einer Anmeldung zur ursprünglichen Seite zurückzukehren (Standardwert)
- Vererbungsreihenfolge: Vererben Sie zuerst
LoginRequiredMixin
und anschließend die Django Generic View (in diesem FallListView
). Mixin wird hauptsächlich zur Funktionserweiterung verwendet, daher ist es eine gängige Praxis, es vor den Kernansichtsklassen zu platzieren. LoginRequiredMixin
leitet Benutzer, die nicht eingeloggt sind, automatisch zursettings.LOGIN_URL
, die als Anmeldeseite angegeben ist. Bei erfolgreicher Anmeldung kehrt der Benutzer über dennext
-Query-Parameter zur ursprünglich angeforderten Seite zurück.
2.2 Verknüpfung mit urls.py
Ansichten, auf die LoginRequiredMixin
angewendet wird, werden auf die gleiche Weise wie bei einfachen CBVs in urls.py
verknüpft.
# urls.py
from django.urls import path
from .views import MyPostListView
urlpatterns = [
path('my-posts/', MyPostListView.as_view(), name='my_posts'),
]
Jetzt, wenn Sie auf den Pfad /my-posts/
zugreifen, werden Sie zur Anmeldeseite weitergeleitet, wenn Sie nicht eingeloggt sind.
3. Mixin für Berechtigungsverwaltung: PermissionRequiredMixin & UserPassesTestMixin
Wenn LoginRequiredMixin
eine Anmeldung erzwingt, dann erlauben PermissionRequiredMixin
und UserPassesTestMixin
den Zugriff nur, wenn bestimmte Berechtigungen oder Bedingungen erfüllt sind.
3.1 Verwendung von PermissionRequiredMixin
Dieses Mixin ist mit dem Berechtigungssystem von Django verknüpft, sodass nur Benutzer mit bestimmten permission
darauf zugreifen können.
# views.py
from django.views.generic import CreateView
from django.contrib.auth.mixins import PermissionRequiredMixin
from .models import Article
from .forms import ArticleForm
class ArticleCreateView(PermissionRequiredMixin, CreateView):
model = Article
form_class = ArticleForm
template_name = 'articles/article_form.html'
success_url = '/articles/'
# Berechtigung im Format 'app_label.permission_codename' angeben
permission_required = 'app_label.add_article'
# Wenn eine von mehreren Berechtigungen ausreicht:
# permission_required = ('app_label.add_article', 'app_label.change_article')
# raise_exception = True # Bei fehlender Berechtigung wird ein 403-Fehler angezeigt (Standardmäßig wird zur Anmeldeseite weitergeleitet)
permission_required
: Die für den Zugriff erforderlichen Berechtigungen sollten als Zeichenfolge (eine oder ein Tuple) angegeben werden. Hauptsächlich verwenden wir die von Djangosauth
-App automatisch generierten Berechtigungen für jedes Modell (add_model
,change_model
,delete_model
,view_model
).
3.2 Verwendung von UserPassesTestMixin
Dieses Mixin wird verwendet, um kompliziertere oder benutzerdefinierte Bedingungen zu prüfen. Zum Beispiel, um sicherzustellen, dass nur der Autor eines Kommentars diesen bearbeiten kann, oder um den Zugriff nur auf Benutzer einer bestimmten Gruppe zu beschränken.
# views.py
from django.views.generic import UpdateView
from django.contrib.auth.mixins import UserPassesTestMixin
from .models import Comment
from .forms import CommentForm
class CommentUpdateView(UserPassesTestMixin, UpdateView):
model = Comment
form_class = CommentForm
template_name = 'comments/comment_form.html'
success_url = '/comments/'
# test_func Methode überschreiben um die Bedingung zu prüfen
def test_func(self):
comment = self.get_object()
# Überprüfen, ob der aktuelle eingeloggte Benutzer der Autor des Kommentars ist
return self.request.user == comment.author or self.request.user.is_superuser
# raise_exception = True # Bei Testfehler wird ein 403-Fehler angezeigt
- Durch Überschreiben der
test_func()
-Methode wird der Zugriff erlaubt, wenn True zurückgegeben wird, und verweigert, wenn False zurückgegeben wird. - Über
self.request.user
kann auf das aktuelle eingeloggte Benutzerobjekt zugegriffen werden.
4. Erstellen von benutzerdefinierten Mixins
Neben den von Django bereitgestellten Mixins können Sie auch Ihre eigenen Mixins erstellen, die in mehreren Ansichten wiederverwendet werden. Zum Beispiel erstellen wir ein Mixin, das den current_year
Kontext in allen Seiten hinzufügt.
# common/mixins.py
from datetime import datetime
class CurrentYearMixin:
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['current_year'] = datetime.now().year
return context
# views.py (Beispiel für die Anwendung)
from django.views.generic import TemplateView
from .common.mixins import CurrentYearMixin
class MyCustomPageView(CurrentYearMixin, TemplateView):
template_name = 'my_custom_page.html'
# my_custom_page.html (in der Vorlage verwenden)
<footer>© {{ current_year }} Meine Website</footer>
CurrentYearMixin
überschreibt dieget_context_data
-Methode, umcurrent_year
zu dem Kontext hinzuzufügen. Es ist wichtig,super().get_context_data(**kwargs)
aufzurufen, um die Kontextdaten der übergeordneten Klasse (oder eines anderen Mixins) zu behalten.
5. Vergleich mit FBV
Funktion | FBV (Funktionsbasierte Ansicht) | CBV + Mixin |
Login/Berechtigungsüberprüfung | @login_required , @permission_required Dekoratoren verwenden. <br> Benutzerdefinierte Bedingungen müssen innerhalb der Funktion direkt geschrieben werden, wie if not request.user.is_authenticated: return redirect(...) . |
LoginRequiredMixin, PermissionRequiredMixin, UserPassesTestMixin usw. können einfach durch Vererbung von Mixins angewendet werden. <br> Ähnlich wie Dekoratoren, jedoch stärker in die CBV-Struktur integriert. |
Wiederverwendbarkeit des Codes | Gemeinsame Logik in separate Funktionen auslagern oder Funktionen mit Dekoratoren selbst schreiben. <br> Duplizierter Code entsteht leicht. | Mixin ermöglicht die Modularisierung benötigter Funktionen und deren Injektion durch mehrfache Vererbung. <br> Viel stärker strukturierter und wiederverwendbarer Code. |
Lesbarkeit des Codes | In jeder Funktion kann die Bedingungsprüfungslogik wiederholt werden. | Alle funktionalen Merkmale (Berechtigungen, Login, usw.) sind leicht erkennbar, nur durch die Liste der Vererbungen der Ansichtsklasse. |
Wartbarkeit | Bei der Hinzufügung neuer Funktionen müssen möglicherweise mehrere Funktionen bearbeitet werden. | Änderungen am Mixin-Klasse haben Auswirkungen auf alle Ansichten, die dieses Mixin verwenden. |
Produktivität bei der Entwicklung (Kern-Keyword) | „Separate Behandlungen für jede Funktion, mögliche Wiederholungen“ | „Modularisierung, einfache Funktionserweiterung, Einhaltung des DRY (Don’t Repeat Yourself) Prinzips, Steigerung der Produktivität“ |
6. Fazit und Ausblick auf die nächste Folge
Mixin ist ein zentrales Element, das die wahre Stärke der Django Klassebasierten Ansichten entfaltet. Damit können wir Wiederverwendbarkeit von Code maximieren, gemeinsame Funktionen modularisieren und die Komplexität von Ansichtsklassen verringern, insbesondere Authentifizierung und Berechtigungsverwaltung sehr effizient umsetzen.
Jetzt haben wir alle grundlegenden Anwendungen von CBV bis zu komplexen CRUD-Szenarien und Funktionserweiterungen durch Mixin betrachtet, und decken fast alle zentralen Aspekte von Django CBV ab.
In der nächsten Folge (8. Folge der Reihe) werden wir zusammenfassen, wie die bis jetzt behandelten CBVs in echten Projekten angewendet werden können, wie sie in komplexen Szenarien kombiniert werden und wie die Vorteile und Grenzen von CBV aussehen.
Frühere Beiträge ansehen
- Klassebasierte Ansicht (CBV) Erkundungsreihe #1 – Der Grund für den Wechsel von FBV zu CBV und die Einstellung der Entwickler
- Klassebasierte Ansicht (CBV) Erkundungsreihe #2 – Grundstruktur der Django-Ansichtsklasse verstehen
- Klassebasierte Ansicht (CBV) Erkundungsreihe #3 – FormView zur einfachen Formularverarbeitung
- Klassebasierte Ansicht (CBV) Erkundungsreihe #4 – Nutzung von ListView & DetailView
- Klassebasierte Ansicht (CBV) Erkundungsreihe #5 – CRUD mit CreateView, UpdateView, DeleteView umsetzen
- Klassebasierte Ansicht (CBV) Erkundungsreihe #6 – Nutzung von TemplateView & RedirectView
„Nutzen Sie das volle Potenzial von Django CBV mit Mixin und
erstellen Sie wartbare und erweiterbare Webanwendungen!“
Es sind keine Kommentare vorhanden.