Onderstaand artikel is deel 7 van de verkenningsserie van Django klassen gebaseerde weergave (CBV), waarin we behandelen hoe we gemeenschappelijke functionaliteit kunnen hergebruiken met Mixin, en hoe we toegangsbeheer en inlogcontroles efficiënt kunnen implementeren. In het vorige artikel (deel 6) hebben we met TemplateView
en RedirectView
eenvoudig pagina rendering en omleiding geautomatiseerd; nu gaan we ontdekken hoe we de herbruikbaarheid en uitbreidbaarheid van CBV tot het maximum kunnen vergroten.
Volg de link hieronder voor het vorige artikel!
Gebruik van TemplateView & RedirectView
“Verhoog de code herbruikbaarheid met Django Mixin en implementeer eenvoudig toegangs- en inlogcontroles!”
1. Mixin, waarom is het nodig?
Django CBV biedt van nature krachtige herbruikbaarheid, maar wat als er gemeenschappelijke functionaliteit is die in verschillende weergaven nodig is? Bijvoorbeeld, vaak is inloggen vereist om toegang te krijgen tot een specifieke pagina, of moeten alleen gebruikers met bepaalde rechten toegang kunnen krijgen. Hier komt het concept van Mixin in beeld.
A Mixin maakt gebruik van het concept van meervoudige overerving om dezelfde methoden of eigenschappen in meerdere klassen te injecteren. In Django CBV kunnen we de Mixin-klasse die een specifieke functionaliteit implementeert, in de weergaveklasse overerven om dubbele code te verminderen en de onderhoudbaarheid te vergroten.
Voorbeelden van het gebruik van Mixin:
- Toegangsbeheer: Controleer of de gebruiker die toegang heeft tot een specifieke weergave ingelogd is of de juiste rechten heeft.
- Formulierverwerkinglogica: Voorafgaande of achteraf verwerkingslogica die in meerdere formulieren nodig is.
- Templatecontext: Contextgegevens die aan alle weergaven moeten worden doorgegeven, toevoegen.
- Logging: Voeg loggingfuncties toe voor en na de uitvoering van bepaalde weergaven.
2. Voorbeeld van Mixin gebruik in Django: LoginRequiredMixin
Een van de meest gebruikte Mixins is LoginRequiredMixin
. Zoals de naam al zegt, dwingt het af dat de gebruiker ingelogd moet zijn om toegang te krijgen tot de betreffende weergave.
2.1 Gebruik van LoginRequiredMixin
LoginRequiredMixin
is opgenomen in het django.contrib.auth.mixins
-module.
# views.py
from django.views.generic import ListView
from django.contrib.auth.mixins import LoginRequiredMixin
from .models import Post # Voorbeeldmodel
class MyPostListView(LoginRequiredMixin, ListView):
model = Post
template_name = 'posts/my_posts.html'
context_object_name = 'posts'
# URL instellen waar ongeauthenticeerde gebruikers naartoe worden omgeleid (optioneel)
# login_url = '/accounts/login/' # settings.LOGIN_URL is de standaard
# redirect_field_name = 'next' # Queryparameternaam om terug te keren naar de oorspronkelijke pagina nadat ingelogd is (standaard)
- Overerfvolgorde: Erfte eerst
LoginRequiredMixin
over, dan de Django Generic View (hierListView
). Mixin wordt meestal gebruikt voor functie toevoeging, dus het is gebruikelijk om deze vóór de belangrijkste weergaveklasse te plaatsen. LoginRequiredMixin
omleidt automatisch naar desettings.LOGIN_URL
loginpagina als de gebruiker niet ingelogd is. Na succesvolle inlog wordt denext
queryparameter gebruikt om terug te keren naar de oorspronkelijk opgevraagde pagina.
2.2 Verbinden met urls.py
De weergave die LoginRequiredMixin
toepast, wordt op dezelfde manier aan urls.py
verbonden als een gewone CBV.
# urls.py
from django.urls import path
from .views import MyPostListView
urlpatterns = [
path('my-posts/', MyPostListView.as_view(), name='my_posts'),
]
Nu, als je toegang probeert te krijgen tot de /my-posts/
route en niet ingelogd bent, word je omgeleid naar de inlogpagina.
3. Mixin voor toegangsbeheer: PermissionRequiredMixin & UserPassesTestMixin
Als LoginRequiredMixin
inloggen afdwingt, dan vereisen PermissionRequiredMixin
en UserPassesTestMixin
dat de gebruiker bepaalde rechten heeft of bepaalde voorwaarden voldoet om toegang te krijgen.
3.1 Gebruik van PermissionRequiredMixin
Django's toegangsbeheersysteem werkt samen om alleen toegang te geven aan gebruikers met specifieke permission
.
# 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/'
# Specificeer de rechten in 'app_label.permission_codename' formaat
permission_required = 'app_label.add_article'
# Toegestaan als tenminste één van meerdere rechten bestaat:
# permission_required = ('app_label.add_article', 'app_label.change_article')
# raise_exception = True # Genereert 403 Forbidden uitzondering bij gebrek aan rechten (standaard is omleiden naar de inlogpagina)
permission_required
: De benodigde rechten voor toegang kunnen als strings (één of een tuple) worden gespecificeerd. Meestal worden rechten automatisch gegenereerd door Django'sauth
app voor elk model (add_model
,change_model
,delete_model
,view_model
).
3.2 Gebruik van UserPassesTestMixin
Als je complexere of aangepaste voorwaarden wilt controleren, gebruik je deze. Bijvoorbeeld, om ervoor te zorgen dat gebruikers alleen hun eigen bijdragen kunnen aanpassen of dat alleen gebruikers in een specifieke groep toegang hebben, is het nuttig.
# 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/'
# Overschrijf de test_func methode om voorwaarden te controleren
def test_func(self):
comment = self.get_object()
# Controleer of de momenteel ingelogde gebruiker de auteur van de reactie is
return self.request.user == comment.author or self.request.user.is_superuser
# raise_exception = True # Genereert 403 Forbidden uitzondering bij testfout
test_func()
methode: als je True teruggeeft, staat dit toegang toe; als je False teruggeeft, wordt de toegang geweigerd.self.request.user
geeft toegang tot het huidige ingelogde gebruikersobject.
4. Aangepaste Mixin maken
Buiten de door Django geboden Mixins, kun je ook je eigen Mixin maken die je in meerdere weergaven kunt hergebruiken. Bijvoorbeeld, maak een Mixin die de current_year
context toevoegt die voor alle pagina's nodig is.
# 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 (voorbeeldoepassing)
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 (gebruik in template)
<footer>© {{ current_year }} My Website</footer>
CurrentYearMixin
overschrijft deget_context_data
methode omcurrent_year
toe te voegen aan de context. Het is belangrijk omsuper().get_context_data(**kwargs)
aan te roepen om de context gegevens van de bovenliggende klasse (of andere Mixin) te behouden.
5. Vergelijken met FBV
Functionaliteit | FBV (functie gebaseerde weergave) | CBV + Mixin |
Inloggen/toegangscontrole | @login_required , @permission_required decorateurs. <br> Voor aangepaste voorwaarden moet dit direct in de functie worden geschreven, zoals if not request.user.is_authenticated: return redirect(...) . |
LoginRequiredMixin, PermissionRequiredMixin, UserPassesTestMixin kunnen eenvoudig worden toegepast door overerving van Mixins. Het is vergelijkbaar met decorateurs, maar meer geïntegreerd binnen het CBV-structuur. |
Code herbruikbaarheid | Algemene logica scheiden in aparte functies of eigen functie-decorateurs schrijven. <br> Dit leidt gemakkelijk tot duplicatie van code. | Via Mixin kunnen benodigde functionaliteiten worden gemoduleerd en via meervoudige overerving worden ingebracht. <br> Dit is veel gestructureerder en verhoogt de herbruikbaarheid. |
Code leesbaarheid | Elke functie kan herhaaldelijk voorwaarden controleren. | Het is eenvoudig om te zien welke functionaliteiten (toegang, inlog, etc.) zijn toegepast, enkel door naar de overervingslijst van de weergaveklasse te kijken. |
Onderhoudbaarheid | Bij het toevoegen van nieuwe functies kan het nodig zijn om meerdere functies te wijzigen. | Door simpelweg de Mixin-klasse te wijzigen, kunnen alle weergaven die deze Mixin gebruiken automatisch worden bijgewerkt. |
Ontwikkelingsproductiviteit (sleutelwoorden) | "Elk functie afzonderlijk verwerken, risico van herhaald werk" | "Modularisatie, eenvoudige functionaliteit uitbreiding, naleving van DRY (Don't Repeat Yourself) principes, verhoogde productiviteit" |
6. Conclusie en voorbeschouwing op het volgende artikel
Mixin is een centraal element dat de werkelijke kracht van Django klassen gebaseerde weergave onthult. Hiermee kunnen we de code herbruikbaarheid maximaliseren, gemeenschappelijke functionaliteit modulariseren en de complexiteit van weergaveklassen verminderen, vooral met essentiële elementen van webapplicaties, zoals authenticatie en toegangsbeheer op een uiterst efficiënte manier implementeren.
Nu hebben we alle kernaspecten van Django CBV bestudeerd, van basisgebruik tot complexe CRUD, en de functionaliteit uit te breiden met Mixins.
In het volgende artikel (serie 8) gaan we bekijken hoe we de behandelde CBV's in een echt project toepassen, hoe we deze in complexe scenario's combineren en een allesomvattend overzicht geven van de voordelen en beperkingen van CBV, waarmee we de serie zullen afsluiten.
Bekijk vorige artikelen opnieuw
- Klasse gebaseerde weergave (CBV) verkenningsserie #1 - De reden om van FBV naar CBV te gaan en de houding van de ontwikkelaar
- Klasse gebaseerde weergave (CBV) verkenningsserie #2 - Begrijpen van Django's basis View-klasse
- Klasse gebaseerde weergave (CBV) verkenningsserie #3 - Eenvoudig formulierverwerking met FormView
- Klasse gebaseerde weergave (CBV) verkenningsserie #4 - Gebruik van ListView & DetailView
- Klasse gebaseerde weergave (CBV) verkenningsserie #5 - Implementeren van CRUD met CreateView, UpdateView, DeleteView
- Klasse gebaseerde weergave (CBV) verkenningsserie #6 - Gebruik van TemplateView & RedirectView
“Maximaliseer het potentieel van Django CBV met Mixins en bouw een webapplicatie die gemakkelijk te onderhouden en uit te breiden is!”
댓글이 없습니다.