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.

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to