[PYTHON] Wie man Decorator in Django benutzt und wie man es macht

Hintergrund

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.

Dekorateure sind Funktionen

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)
 

Ohne Decorator-Parameter

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.

Einführung

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. ..

Schritt 2

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

Wie man Decorator in Django benutzt und wie man es macht
Verwendung ist und == in Python
So installieren Sie den Cascade-Detektor und wie verwenden Sie ihn
So machen Sie den Containernamen in Docker als Subdomain zugänglich
Wie benutzt man den Dekorateur?
[Python] [Django] Verwendung des Auswahlfelds und Hinzufügen von Optionen
So definieren Sie Decorator und Decomaker mit einer Funktion
Verwendung von Bootstrap in der generischen Klassenansicht von Django
Verwendung von Klassen in Theano
Wie man CSS in Django reflektiert
Verwendung von .bash_profile und .bashrc
So installieren und verwenden Sie Graphviz
Wie man MySQL mit Python benutzt
Verwendung von ChemSpider in Python
Verwendung von PubChem mit Python
Versuchen Sie es mit GUI, PyQt in Python
Verwendung von Laravel-ähnlichem ORM / Query Builder Orator mit Django
Wie Sie pyenv und pyenv-virtualenv auf Ihre eigene Weise verwenden
[Einführung in die Udemy Python3 + -Anwendung] 36. Verwendung von In und Not
Erstellen und Verwenden von statischen / dynamischen Bibliotheken in C-Sprache
Vergleich der Verwendung von Funktionen höherer Ordnung in Python 2 und 3
Verwendung berechneter Spalten in CASTable
[Einführung in Python] Wie verwende ich eine Klasse in Python?
Verarbeitung zur Verwendung von notMNIST-Daten in Python (und versucht, sie zu klassifizieren)
So installieren Sie OpenCV in Cloud9 und führen es in Python aus
So installieren und verwenden Sie pandas_datareader [Python]
So löschen Sie abgelaufene Sitzungen in Django
Verwendung von Google Test in C-Sprache
Verwendung von Funktionen in separaten Dateien Perl-Version und Python-Version
Verwendung von Anacondas Interpreter mit PyCharm
Python: Verwendung von Einheimischen () und Globalen ()
Verwendung von __slots__ in der Python-Klasse
Verwendung von Python zip und Aufzählung
So führen Sie vom Server gesendete Ereignisse in Django durch
Verwendung regulärer Ausdrücke in Python
So verwenden Sie Map in ViewPager von Android
Verwendung von pandas Timestamp und date_range
So geben Sie die im Django-Modell enthaltenen Daten im JSON-Format zurück und ordnen sie der Broschüre zu
Verwendung der C-Bibliothek in Python
Einführung des Sinatra-Frameworks und dessen Verwendung
So generieren Sie eine Sequenz in Python und C ++
So implementieren Sie Rails-Helfer-ähnliche Funktionen in Django
Verwendung der Python-Bildbibliothek in der Python3-Serie
So reflektieren Sie ImageField in Django + Docker (Kissen)
Zusammenfassung der Verwendung von MNIST mit Python
Wie man tkinter mit Python in Pyenv benutzt
[Python] Verwendung von Hash-Funktion und Taple.
So erstellen Sie eine Rest-API in Django
So nehmen Sie Python Interpreter-Änderungen in Pycharm vor
Wie man Autokorrelation und partielle Autokorrelation mit Python zeichnet
Verwendung von xml.etree.ElementTree
Wie benutzt man Python-Shell
Hinweise zur Verwendung von tf.data
Verwendung von virtualenv
Wie benutzt man Seaboan?
Verwendung von Image-Match
Verwendung von Pandas 2