2009-11-27 3 views
1
from decorator import decorator 
from pylons.decorators.util import get_pylons 

def allowed_roles(roles): 
    def wrapper(func, *args, **kwargs): 
     session = get_pylons(args).session 
     # edit pylons session here. 
     return func(*args, **kwargs) 
    return decorator(wrapper) 

Quelqu'un peut-il expliquer comment cela fonctionne?comment pylons décorateur fonctionne

+0

Cela me semble étrange - je ne comprends pas vraiment pourquoi 'session' est défini mais jamais référencé. Il manque probablement quelque chose de stupide. –

+0

L'argument de allowed_roles, 'roles', n'est pas non plus utilisé. ? – unutbu

Répondre

2

Comme tous les autres travaux de décorateur -

Un décorateur est une fonction qui reçoit une fonction comme argument et renvoie une autre fonction. La fonction retournée prendra "la place" de la fonction d'origine. Puisque l'effet désiré avec un decoratos est habituellement de pouvoir exécuter du code avant et après que la fonction originale (celle qui est décorée) fonctionne, les décorateurs créent une nouvelle fonction qui prend un certain nombre de paramètres anonymes et nommés (le * préfixe "args" et le préfixe "kwargs" sont responsables de stocker les paramètres dans une liste et un dictionnaire, respectivement)

Dans cette nouvelle fonction, vous avez un endroit pour écrire votre code de vérification - et puis il appelle la fonction d'origine - qui dans ce contexte est appelée "func", et renvoie sa valeur d'origine. L'appel de "decorator.decorator" n'est pas strictement nécessaire: il modifie certaines fonctions de la fonction wrapper de façon à ce qu'elle apparaisse plus proche de la fonction d'origine (comme l'attribut 'func_name') - mais le code devrait fonctionner sans ça. Après avoir défini un décorateur, vous devez l'appliquer à une fonction ou à une méthode que vous souhaitez décorer: placez simplement @allowed_roles dans une ligne précédant la définition de la fonction que vous souhaitez décorer.

+1

(à temps: ceci n'est pas spécifique aux pylônes - cette façon de décorer des fonctions ou des méthodes est une fonctionnalité Python – jsbueno