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