Python decorator with Flask

You have two wrapper functions where you only need one. Notice that each wrapper function takes one argument. This should be a clue as to what is happening.

You have:

def decorator(take_a_function):
    def wrapper1(take_a_function):
        def wrapper2(*takes_multiple_arguments):
           # do stuff
           return take_a_function(*takes_multiple_arguments)

        return wrapper2
    return wrapper1

When you decorate a function with it:

@decorator
def my_function(*takes_multiple_arguments):
   pass

This is equivalent to:

def my_function(*takes_multiple_arguments):
   pass

my_function = decorator(my_function)

but doing decorator(my_function) returns wrapper1, which if you recall takes one argument, take_a_function. This is clearly not what you want. You want wrapper2 returned. As in your answer, the solution is to remove the outer wrapper(wrapper1):

from functools import wraps

def decorator(takes_a_function):
    @wraps(takes_a_function)
    def wrapper(*args, **kwargs):
        # logic here
        return takes_a_function(*args, **kwargs)

    return wrapper

Ok I solved this problem by reading this answer Route to view_func with same decorators "flask" given by @will-hart

I simply remove the def wrapper(f) and everything seems fine now. at leaset no grammar error.

from functools import wraps

def requires_admin(f):
    @wraps(f)
    def wrapped(*args, **kwargs):
        #if blah blah:
            #return blah blah
        return f(*args, **kwargs)
    return wrapped

Since I am pretty new to decorator and I dont know why. But hope this can help other ppl.