gpt4 book ai didi

Flask 的 Python 装饰器

转载 作者:太空狗 更新时间:2023-10-29 20:49:56 25 4
gpt4 key购买 nike

我需要为 Flask 路由函数添加一个 python 装饰器,(基本上我编辑了 here 中的代码)

def requires_admin(f):
def wrapper(f):
@wraps(f)
def wrapped(*args, **kwargs):
#if not admin:
#return render_template('error.html')
return f(*args, **kwargs)
return wrapped
return wrapper

然后像这样使用它就可以了:

@app.route('/admin/action')
@requires_admin
def AdminAction():
#NO error if NO parameter

但是这样使用会报错:

@app.route('/admin/action/<int:id>')
@requires_admin
def AdminAction(id):

在 Flask 0.10 中,我得到这样的错误(我刚从 Flask 0.9 更新到 0.10,在 Flask 0.9 中没有这样的语法错误):

    @requires_admin
File "/usr/local/lib/python2.6/dist-packages/Flask-0.10.1-py2.6.egg/flask/app.
py", line 1013, in decorator
self.add_url_rule(rule, endpoint, f, **options)
File "/usr/local/lib/python2.6/dist-packages/Flask-0.10.1-py2.6.egg/flask/app.
py", line 62, in wrapper_func
return f(self, *args, **kwargs)
File "/usr/local/lib/python2.6/dist-packages/Flask-0.10.1-py2.6.egg/flask/app.
py", line 984, in add_url_rule
'existing endpoint function: %s' % endpoint)
AssertionError: View function mapping is overwriting an existing endpoint functi
on: wrapper

我对装饰器的东西很陌生,我该如何纠正这个错误?

最佳答案

您有两个包装函数,而您只需要一个。请注意,每个包装函数都有一个参数。这应该是正在发生的事情的线索。

你有:

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

当你用它装饰一个函数时:

@decorator
def my_function(*takes_multiple_arguments):
pass

这相当于:

def my_function(*takes_multiple_arguments):
pass

my_function = decorator(my_function)

但是执行 decorator(my_function) 返回 wrapper1,如果你还记得的话需要一个参数,take_a_function。这显然不是你想要的。您希望返回 wrapper2。正如您的回答一样,解决方案是删除外包装(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

关于Flask 的 Python 装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21352718/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com