[PYTHON] Comment utiliser Decorator dans Django et comment le créer

Contexte

Je crée une webapp avec Django, mais quand je lis le document sur la page Admin, il semble que les deux codes suivants peuvent être remplacés.

admin.py


from django.contrib import admin
from .models import Author

#Pas de décorateur
  class AuthorAdmin(admin.ModelAdmin):
    pass
  admin.site.register(Author, AuthorAdmin)

#Avec décorateur
  @admin.register(Author)
  class AuthorAdmin(admin.ModelAdmin):
    pass

Eh bien, je ne me sens pas reconnaissant s'il n'y en a qu'un, mais si des dizaines d'admin.site.register (qch, sthAdmin) sont alignés, ce n'est pas facile pour les yeux, il vaut donc mieux le remplacer. Je veux dire.

Alors qu'est-ce qu'un décorateur! J'ai pensé, alors je vais enquêter et résumer dans la fourchette que j'ai en quelque sorte comprise.

L'article original est ici. Cela semble être un sujet qui ne peut être compris et utilisé qu'après que la valeur de l'expérience a augmenté un peu plus. Au moins pour moi.

Si vous résumez seulement ce que vous savez en premier,

--Si vous le définissez sur une fonction ou une classe, cela vous donnera un certain effet.

Eh bien, cela semble pratique, alors je m'en souviendrai un par un chaque fois qu'il apparaîtra. Commençons.

Les décorateurs sont des fonctions

Ignorez le concept ennuyeux de @ pour le moment et comparez le cas avec et sans le décorateur.

example1.py



#Avec décorateur
  @login_required
  def my_view(request):
   return HttpResponse()


#Pas de décorateur
  def my_view(request):
   return HttpResponse

  my_view = login_required(my_view)

example2.py


#Avec décorateur
  @require_http_method(['GET','POST'])
  def my_view(request):
   return HttpResponse()


#Pas de décorateur
  def my_view(request):
   return HttpResponse()
  
  my_view = require_http_method(['GET'],['POST'])(my_view)
 

Sans paramètres Decorator

Comme vous pouvez le voir dans l'explication jusqu'à présent, le décorateur n'est qu'une fonction, et il semble qu'il prenne la fonction qui suit comme paramètre et assume le rôle. (Interprété avec ceci, il n'y a aucun problème pour le moment)

Par exemple, lorsque my_view (request) est appelé, il semble que cela équivaut en fait à l'appel de login_required (my_view) (request).

Une chose à noter ici est que Decorator est un type de modèle de conception lors du codage et n'est pas unique à python ou Django.

Donc, si vous avez des connaissances en python, vous pouvez créer vous-même un décorateur. Alors, voyons comment faire un décorateur petit à petit.

introduction

Créez un décorateur d'identité. Il ne fait rien, il prend juste une fonction et la renvoie. C'est juste le rôle de la vue dans django.

example3.py


def identity(a_view):
  return a_view

Dans ce cas, le décorateur ci-dessus fait le même travail que my_view (request). Eh bien, je ne suis toujours pas sûr. ..

Étape 2

J'ai décidé de créer un décorateur qui fasse un travail. Essayons de créer un décorateur qui enregistre le nombre de fois où la vue est appelée.

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

Ce que j'ai fait ici

――Prends une sorte de journal --Retourne la vue reçue par le paramètre tel quel

Quel simple décorateur. La procédure à exécuter est la suivante.

Je ne sais pas si cela a vraiment du sens, mais il semble que je puisse me connecter avec cela pour le moment.

Ensuite, ajoutez une fonction à ce décorateur pour voir si l'utilisateur qui tente d'exécuter wrapped_view est connecté.

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

Je ne suis pas sûr, mais je me demande si ma mémoire et ma compréhension sont mauvaises. ..

Recommended Posts

Comment utiliser Decorator dans Django et comment le créer
Comment utiliser is et == en Python
Comment installer le détecteur Cascade et comment l'utiliser
Comment rendre le nom du conteneur accessible dans Docker en tant que sous-domaine
Comment utiliser le décorateur
[Python] [Django] Comment utiliser le champ de choix et comment ajouter des options
Comment définir Decorator et Decomaker avec une seule fonction
Comment utiliser le bootstrap dans la vue de classe générique Django
Comment utiliser les classes dans Theano
Comment refléter CSS dans Django
Comment utiliser .bash_profile et .bashrc
Comment installer et utiliser Graphviz
Comment utiliser Mysql avec python
Comment utiliser ChemSpider en Python
Comment utiliser PubChem avec Python
Essayez de le faire avec GUI, PyQt en Python
Comment utiliser ORM / Query Builder Orator de type Laravel avec Django
Comment utiliser pyenv et pyenv-virtualenv à votre manière
[Introduction à l'application Udemy Python3 +] 36. Utilisation de In et Not
Comment créer et utiliser des bibliothèques statiques / dynamiques en langage C
Comparaison de l'utilisation des fonctions d'ordre supérieur dans Python 2 et 3
Comment utiliser les colonnes calculées dans CASTable
[Introduction à Python] Comment utiliser la classe en Python?
traitement pour utiliser les données notMNIST en Python (et essayé de les classer)
Comment installer OpenCV sur Cloud9 et l'exécuter en Python
Comment installer et utiliser pandas_datareader [Python]
Comment supprimer des sessions expirées dans Django
Comment utiliser Google Test en langage C
Comment utiliser les fonctions dans des fichiers séparés version Perl et version Python
Comment utiliser l'interpréteur d'Anaconda avec PyCharm
python: Comment utiliser les locals () et globals ()
Comment utiliser __slots__ dans la classe Python
Comment utiliser le zip Python et énumérer
Comment faire des événements envoyés par le serveur dans Django
Comment utiliser les expressions régulières en Python
Comment utiliser Map dans ViewPager d'Android
Comment utiliser les pandas Timestamp et date_range
Comment retourner les données contenues dans le modèle django au format json et les mapper sur le dépliant
Comment utiliser la bibliothèque C en Python
Introduction du cadre de style Sinatra et comment l'utiliser
Comment générer une séquence en Python et C ++
Comment implémenter la fonctionnalité de type helper Rails dans Django
Comment utiliser la bibliothèque d'images Python dans la série python3
Comment refléter ImageField dans Django + Docker (oreiller)
Résumé de l'utilisation de MNIST avec Python
Comment utiliser tkinter avec python dans pyenv
[Python] Comment utiliser la fonction de hachage et taple.
Comment créer une API Rest dans Django
Comment apporter des modifications à l'interpréteur Python dans Pycharm
Comment tracer l'autocorrélation et l'autocorrélation partielle avec Python
Comment utiliser xml.etree.ElementTree
Comment utiliser Python-shell
Remarques sur l'utilisation de tf.data
Comment utiliser virtualenv
Comment utiliser Seaboan
Comment utiliser la correspondance d'image
Comment utiliser Pandas 2