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.
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
:
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)),
]
https://github.com/vorujack/decorate_url
Il semble que vous puissiez également spécifier un décorateur pour include ().
Recommended Posts