I need to add a python decorator to Flask route functions, (basically I edited the code from here)
def requires_admin(f):
def wrapper(f):
@wraps(
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.
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