2009-05-20 5 views
16

Y at-il une différence dans l'utilisation de login_required decorator dans urls.py et dans views.py? Si je mets cette ligne:login_required décorateur dans django

url(r'^add/$', login_required(views.add_media), name = 'add_media_action') 

en urls.py-je obtenir le même effet que la décoration add_media fonction views.py:

@login_required 
def add_media(request): 
    ... 

Répondre

29

En Python, un décorateur est une fonction qui prend une fonction en argument, et renvoie une fonction décorée. La syntaxe @login_required peut être traduit:

def add_media(request): 
    ... 
add_media = login_required(add_media) 

Donc, si vous appliquez le décorateur manuellement (comme dans votre premier extrait), il devrait générer le même effet.

L'approche dans votre premier extrait est utile si vous souhaitez utiliser les versions décorées et non décorées de votre vue.

+9

+1 en particulier pour les notes dans la dernière phrase. –

3

Oui, ce sont les mêmes. Les décorateurs sont du sucre syntaxique pour envelopper une fonction dans un autre. Dans les deux cas, vous entourez login_required autour de views.add_media.

8

Comme d'autres l'ont souligné, ils sont en effet équivalents. Deux choses supplémentaires à prendre en compte si vous souhaitez profiter de cette approche:

  1. le faire dans le urls.py divorce de l'exigence de connexion de la place dans le code où est défini la chose étant décorée. Pour cette raison, vous (ou d'autres responsables) pouvez oublier que la fonction a été décorée. Comme vous appliquez la sécurité dans le fichier urls, il est possible que quelqu'un ajoute par erreur une autre URL qui pointe vers la même fonction, mais oubliez d'envelopper la fonction dans login_required, ce qui entraîne un trou de sécurité.

Espérons que ça aide.

Questions connexes