Ich mache eine Webanwendung mit Django, aber wenn ich das Dokument auf der Admin-Seite lese, scheinen die folgenden zwei Codes ersetzt zu werden.
admin.py
from django.contrib import admin
from .models import Author
#Kein Dekorateur
class AuthorAdmin(admin.ModelAdmin):
pass
admin.site.register(Author, AuthorAdmin)
#Mit Dekorateur
@admin.register(Author)
class AuthorAdmin(admin.ModelAdmin):
pass
Nun, ich bin nicht dankbar, wenn es nur einen gibt, aber wenn Dutzende von admin.site.register (etw, etwAdmin) in einer Reihe stehen, ist das für die Augen nicht einfach, daher ist es besser, ihn zu ersetzen. Ich meine.
Was ist ein Dekorateur? Ich dachte, also werde ich es untersuchen und in dem Bereich zusammenfassen, den ich irgendwie verstanden habe.
Der Originalartikel ist hier. Es scheint ein Thema zu sein, das erst verstanden und verwendet werden kann, wenn der Erfahrungswert etwas mehr gestiegen ist. Zumindest für mich.
Wenn Sie nur das zusammenfassen, was Sie zuerst wissen,
Nun, es scheint praktisch zu sein, also werde ich mich jedes Mal einzeln daran erinnern, wenn es erscheint. Lasst uns beginnen.
Ignorieren Sie vorerst das nervige Konzept von @ und vergleichen Sie den Fall mit und ohne Decorator.
example1.py
#Mit Dekorateur
@login_required
def my_view(request):
return HttpResponse()
#Kein Dekorateur
def my_view(request):
return HttpResponse
my_view = login_required(my_view)
example2.py
#Mit Dekorateur
@require_http_method(['GET','POST'])
def my_view(request):
return HttpResponse()
#Kein Dekorateur
def my_view(request):
return HttpResponse()
my_view = require_http_method(['GET'],['POST'])(my_view)
Wie Sie der bisherigen Erklärung entnehmen können, ist der Dekorateur nur eine Funktion, und es scheint, dass er die folgende Funktion als Parameter verwendet und die Rolle übernimmt. (Interpretiert damit gibt es derzeit kein Problem)
Wenn beispielsweise my_view (Anfrage) aufgerufen wird, scheint dies tatsächlich dem Aufruf von login_required (my_view) (Anfrage) zu entsprechen.
Hierbei ist zu beachten, dass Decorator eine Art Designmuster für die Codierung ist und nicht nur für Python oder Django gilt.
Wenn Sie also etwas über Python wissen, können Sie selbst einen Dekorateur machen. Schauen wir uns also an, wie man nach und nach einen Dekorateur macht.
Erstellen Sie einen Identitätsdekorateur. Es macht nichts, es nimmt nur eine Funktion und gibt sie zurück. Es ist nur die Rolle der Sicht in Django.
example3.py
def identity(a_view):
return a_view
In diesem Fall erledigt der obige Dekorateur den gleichen Job wie my_view (Anfrage). Nun, ich bin mir immer noch nicht sicher. ..
Ich beschloss, einen Dekorateur zu machen, der tatsächlich etwas Arbeit leistet. Versuchen wir, einen Dekorateur zu erstellen, der protokolliert, wie oft die Ansicht aufgerufen wird.
example4.py
def log(a_view):
def _wrapped_view(request, *args, **kwargs):
logger.log('My view is called')
return a_view(request, *args, **kwargs)
return _wrapped_view
Was ich hier gemacht habe
――Nehmen Sie eine Art Protokoll --Geben Sie die von parametar empfangene Ansicht zurück
Was für ein einfacher Dekorateur. Die auszuführende Prozedur ist wie folgt.
Ich weiß nicht, ob es wirklich Sinn macht, aber es scheint, dass ich mich vorerst damit anmelden kann.
Fügen Sie diesem Dekorator als Nächstes eine Funktion hinzu, um festzustellen, ob der Benutzer angemeldet ist, der versucht, wrap_view auszuführen.
example5.py
def login_required(a_view):
def _wrapped_view(request, *args, **kwargs):
if request.user.is_authenticated():
return a_view(request, *args, **kwargs)
return HttpResponseForbiden()
return _wrapped_view
Ich bin mir nicht sicher, aber ich frage mich, ob mein Gedächtnis und mein Verständnis schlecht sind. ..
Recommended Posts