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.