python / intermediate
Snippet
Django View Berechtigungs-Dekoratoren
Dekoratoren bieten deklarative Autorisierungslogik und halten View-Code sauber und lesbar. login_required leitet nicht-authentifizierte Benutzer zu einer Login-Seite weiter. permission_required prüft spezifische Berechtigungen auf dem User-Objekt. user_passes_test akzeptiert ein aufrufbares Objekt, das den User empfängt und einen Boolean zurückgibt, was benutzerdefinierte Logik ermöglicht. Dekoratoren werden der Reihe nach ausgewertet und das Kombinieren mehrerer Berechtigungen erfordert, dass alle gewährt werden.
snippet.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from django.contrib.auth.decorators import (login_required, permission_required, user_passes_test)from django.shortcuts import render@login_required(login_url='/login/')def dashboard(request):return render(request, 'dashboard.html')@permission_required('catalog.change_product', raise_exception=True)def edit_product(request, product_id):return render(request, 'edit_product.html', {'id': product_id})def is_verified_user(user):return user.is_authenticated and getattr(user, 'email_verified', False)@user_passes_test(is_verified_user, login_url='/verify-email/')def premium_content(request):return render(request, 'premium.html')# Combining multiple permissions with AND logicfrom django.contrib.auth.decorators import permission_required@permission_required('orders.add_order', 'orders.change_order')def process_order(request):pass
django
Erklärung
1
@login_required(login_url='/login/')
Leitet zu benutzerdefinierter URL statt Standard /accounts/login/ weiter
2
@permission_required('catalog.change_product', raise_exception=True)
Erhebt PermissionDenied statt Weiterleitung wenn Berechtigung fehlt
3
@user_passes_test(is_verified_user, login_url='/verify-email/')
Benutzerdefinierte Testfunktion für anwendungsspezifische Verifikationslogik
4
@permission_required('orders.add_order', 'orders.change_order')
Mehrere Strings = User braucht ALLE Berechtigungen (UND-Logik)