[PYTHON] Si vous écrivez View decorator dans urls.py dans Django, la liste sera plus élevée.

Dans Django, les décorateurs de vue sont généralement écrits dans views.py, mais il est recommandé de l'écrire dans urls.py pour une meilleure liste.

Utilisation normale (spécifiez le décorateur dans views.py)

S'il existe plusieurs vues et que l'implémentation de chaque vue devient importante, il devient difficile de vérifier quel décorateur est spécifié pour quelle vue.

views.py


def view1(request):
    :
    #Traitement long
    :

@login_required
@staff_member_required
def view2(request):
    :
    #Traitement long
    :

@login_required
@has_permission('xxx')
def view3(request):
    :
    #Traitement long
    :

@login_required
@has_permission('xxx')
def view4(request):
    :
    #Traitement long
    :

Spécifiez le décorateur dans urls.py

Comme urls.py n'écrit essentiellement qu'une seule ligne de code pour une vue, il semble que la liste sera élevée si vous pouvez spécifier le décorateur ici. Pour spécifier un décorateur dans urls.py, écrivez:

urls.py


urlpatterns = [
    url(r'^$', login_required(has_permission('xxx')(views.view4)))
]

Si cela reste tel quel, il sera imbriqué et difficile à lire lors de l'utilisation de plusieurs décorateurs, alors créez et utilisez une fonction pour spécifier les décorateurs.

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

De plus, comme la même combinaison est souvent utilisée pour spécifier le décorateur, ces motifs sont définis comme des constantes.

python


#Accessible sans connexion
PUBLIC = []

#Uniquement accessible aux personnes à l'intérieur
STAFF_ONLY = [
    login_required,
    staff_member_required,
]

#Uniquement accessible aux personnes autorisées xxx
XXX = [
    login_required,
    has_permission('xxx'),
]

Cela facilite la vérification des spécifications de chaque vue.

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

Il y avait aussi une telle chose

https://github.com/vorujack/decorate_url

Il semble que vous puissiez également spécifier un décorateur pour include ().

Recommended Posts

Si vous écrivez View decorator dans urls.py dans Django, la liste sera plus élevée.
Si vous supprimez la liste à mettre en boucle, vous deviendrez terrible.
[Django 2.2] Comment affichez-vous la destination de la relation dans Django? [Affichage de liste]
Si vous ajoutez sudo dans ubuntu, il sera appelé le python par défaut.
Vous serez ingénieur dans 100 jours - Jour 29 - Python - Bases du langage Python 5
Vous serez ingénieur dans 100 jours - Jour 33 - Python - Bases du langage Python 8
Vous serez ingénieur dans 100 jours --Jour 26 --Python --Basiques du langage Python 3
Si vous modifiez votre mot de passe dans Django, vous serez déconnecté sans autorisation
Vous serez ingénieur dans 100 jours --Jour 32 --Python --Basiques du langage Python 7
Si une exception survient dans la fonction, elle sera transmise à l'appelant 2
Si une exception survient dans la fonction, elle sera transmise à l'appelant 1
Je n'ai pas eu besoin d'écrire décorateur en classe Merci contextmanager
Vous serez ingénieur dans 100 jours --Jour 28 --Python --Les bases du langage Python 4
Spécifiez l'URL de la vue dans le modèle Django
[Django] css dans le projet ne peut pas être lu
Écrire un décorateur en classe
Vous serez ingénieur dans 100 jours ――Jour 63 ――Programmation ――À propos de la probabilité 1
Comment écrire une validation personnalisée dans Django REST Framework
Vous serez ingénieur dans 100 jours - Jour 27 - Python - Exercice Python 1
Vous serez ingénieur dans 100 jours ――Jour 65 ――Programmation ――A propos de la probabilité 3
Vous serez ingénieur dans 100 jours ――Jour 64 ――Programmation ――À propos de la probabilité 2
Vous serez ingénieur dans 100 jours - Jour 34 - Python - Exercice Python 3
Si __name__ == Levez la main, si vous écrivez le code sous '__ main__'
Vous serez ingénieur dans 100 jours - Jour 31 - Python - Python Exercice 2
Que faire si vous vous fâchez contre les `` déclarations '' doivent être une liste 2D ... dans la flèche matplotlib
Si vous écrivez un test piloté par table go en python, il peut être préférable d'utiliser subTest