[PYTHON] Wenn Sie View decorator in urls.py in Django schreiben, ist die Liste höher.

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.

Normale Verwendung (Dekorator in views.py angeben)

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
    :

Geben Sie den Dekorator in urls.py an

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)),
]

Es gab auch so etwas

https://github.com/vorujack/decorate_url

Es scheint, dass Sie auch einen Dekorator für include () angeben können.

Recommended Posts

Wenn Sie View decorator in urls.py in Django schreiben, ist die Liste höher.
Wenn Sie die Liste entfernen, die geloopt werden soll, werden Sie schrecklich.
[Django 2.2] Wie zeigen Sie das Beziehungsziel in Django an? [Listenansicht]
Wenn Sie sudo in Ubuntu hinzufügen, wird es als Standardpython bezeichnet.
Sie werden in 100 Tagen Ingenieur - 29. Tag - Python - Grundlagen der Python-Sprache 5
Sie werden in 100 Tagen Ingenieur - Tag 33 - Python - Grundlagen der Python-Sprache 8
Sie werden in 100 Tagen Ingenieur - 26. Tag - Python - Grundlagen der Python-Sprache 3
Wenn Sie Ihr Passwort in Django ändern, werden Sie ohne Erlaubnis abgemeldet
Sie werden in 100 Tagen Ingenieur - Tag 32 - Python - Grundlagen der Python-Sprache 7
Wenn in der Funktion eine Ausnahme auftritt, wird diese an den Anrufer 2 übertragen
Wenn in der Funktion eine Ausnahme auftritt, wird diese an den Anrufer 1 übertragen
Ich musste im Unterricht keinen Dekorateur schreiben. Danke Kontextmanager
Sie werden in 100 Tagen Ingenieur - 28. Tag - Python - Grundlagen der Python-Sprache 4
Geben Sie die Ansichts-URL in der Django-Vorlage an
[Django] CSS im Projekt kann nicht gelesen werden
Schreiben Sie Dekorateur in der Klasse
Sie werden in 100 Tagen Ingenieur - Tag 63 - Programmierung - Wahrscheinlichkeit 1
So schreiben Sie eine benutzerdefinierte Validierung in Django REST Framework
Sie werden in 100 Tagen Ingenieur - 27. Tag - Python - Python-Übung 1
Sie werden in 100 Tagen Ingenieur. ――Tag 65 ――Programmieren ――Über Wahrscheinlichkeit 3
Sie werden in 100 Tagen Ingenieur. ――Tag 64 ――Programmieren ――Über Wahrscheinlichkeit 2
Sie werden in 100 Tagen Ingenieur - Tag 34 - Python - Python-Übung 3
Wenn __name__ == Heben Sie Ihre Hand, wenn Sie den Code unter '__ main__' schreiben.
Sie werden in 100 Tagen Ingenieur - 31. Tag - Python - Python-Übung 2
Was zu tun ist, wenn Sie sich über "Umkehrungen" ärgern, muss eine 2D-Liste sein ... im matplotlib-Pfeil
Wenn Sie einen go table-gesteuerten Test in Python schreiben, ist es möglicherweise besser, subTest zu verwenden