In Django werden View-Dekorateure normalerweise in views.py geschrieben. Es wird jedoch empfohlen, dies in urls.py zu schreiben, um eine bessere Auflistung zu erhalten.
Wenn mehrere Ansichten vorhanden sind und die Implementierung jeder Ansicht groß wird, ist es schwierig zu überprüfen, welcher Dekorator für welche Ansicht angegeben ist.
views.py
def view1(request):
:
#Lange Bearbeitung
:
@login_required
@staff_member_required
def view2(request):
:
#Lange Bearbeitung
:
@login_required
@has_permission('xxx')
def view3(request):
:
#Lange Bearbeitung
:
@login_required
@has_permission('xxx')
def view4(request):
:
#Lange Bearbeitung
:
Da urls.py im Grunde nur eine Codezeile für eine Ansicht schreibt, scheint die Liste hoch zu sein, wenn Sie hier den Dekorator angeben können. Um einen Dekorator in urls.py anzugeben, schreiben Sie:
urls.py
urlpatterns = [
url(r'^$', login_required(has_permission('xxx')(views.view4)))
]
Wenn dies unverändert bleibt, ist es verschachtelt und bei Verwendung mehrerer Dekoratoren schwer zu lesen. Erstellen und verwenden Sie daher eine Funktion zum Festlegen von Dekoratoren.
urls.py
def decorate(view_func, decorators):
for decorator in reversed(decorators):
view_func = decorator(view_func)
urlpatterns = [
url(r'^$', decorete(views.view4, [login_required, has_permission('xxx')]))
]
Da häufig dieselbe Kombination verwendet wird, um den Dekorateur anzugeben, werden diese Muster als Konstanten definiert.
python
#Zugriff ohne Login
PUBLIC = []
#Nur für Personen im Inneren zugänglich
STAFF_ONLY = [
login_required,
staff_member_required,
]
#Nur für Personen mit Genehmigung xxx zugänglich
XXX = [
login_required,
has_permission('xxx'),
]
Dies erleichtert das Überprüfen der Spezifikationen jeder Ansicht.
urls.py
urlpatterns = [
url(r'^view1/$', decorate(views.view1, PUBLIC)),
url(r'^view2/$', decorate(views.view1, STAFF_ONLY)),
url(r'^view3/$', decorate(views.view2, XXX)),
url(r'^view4/$', decorate(views.view3, XXX)),
]
https://github.com/vorujack/decorate_url
Es scheint, dass Sie auch einen Dekorator für include () angeben können.
Recommended Posts