How do I implement two decorators in Python both of which would eventually want to call the calling function

Rafael Durán Castañeda rafadurancastaneda at gmail.com
Sat Aug 6 03:49:30 EDT 2011


You don't need doing something special, each decorator returns a new 
function that and only the result function formed by all decorators will 
be run. Consider this:

def clear_cache(func):
     def decorator(*args, **kwargs):
         print "cache cleared"
         return func(*args, **kwargs)
     return decorator


def login(func):
     def decorator(*args, **kwargs):
         print "login"
         return func(*args, **kwargs)
     return decorator

@login
@clear_cache
def post(msg= "POST", *args):
     print msg
     return args


result = post("POST", "something")
print result

The output will be:

login
cache cleared
POST
('something',)

On 06/08/11 07:49, Devraj wrote:
> Hi all,
>
> I am trying to simply my Web application handlers, by using Python
> decorators.
>
> Essentially I want to use decorators to abstract code that checks for
> authenticated sessions and the other that checks to see if the cache
> provider (Memcache in this instance) has a suitable response.
>
> Consider this method definition with the decorators:
>
> @auth.login_required
> @cache.clear
> def post(self, facility_type_id = None):
>
> auth.login_required checks to see if the user is logged in, otherwise
> returns an appropriate error message, or executes the original
> function.
>
> cache.clear would check to to see if the cache has a particular key
> and drop that, before it executes the calling method.
>
> Both auth.login_required and cache.clear would want to eventually
> execute the calling method (post).
>
> > From what I've read both, doing what I am doing now would execute the
> calling method (post) twice.
>
> My question, how do I chain decorators that end up executing the
> calling method, but ensure that it's only called once.
>
> Appreciate any pointers and thanks for your time.




More information about the Python-list mailing list