gpt4 book ai didi

python - Flask app.add_url_rule 装饰器错误

转载 作者:行者123 更新时间:2023-12-01 05:16:36 25 4
gpt4 key购买 nike

我的 Flask 路由中有一堆装饰器,我试图将它们压缩成一个(包括 @app.route)。

我有以下@route函数:

from functools import wraps
def route(route, method):
def decorator(f):
print 'decorator defined'
print 'defining route'
app.add_url_rule(route, methods=method, view_func=f)
print 'route defined'
@wraps(f)
def wrapper(*args, **kwargs):
print 'Hello'
# do stuff here such as authenticate, authorise, check request json/arguments etc.
# these will get passed along with the route and method arguments above.
return f(*args, **kwargs)
return wrapper
return decorator

和示例路线:

@route('/status', ['GET'])
def status():
return Response('hi', content_type='text/plain')

路线正在被定义,但是wrapper()从未被调用,这真的很奇怪。当我将 app.add_url_rule 移到装饰器外部到文件末尾时,wrapper() 会被调用;因此,decorator Defined 语句会在 Flask 启动时打印,而 Hello 会在我按预期点击 GET/status 路由时打印。

但是,当我将 app.add_url_rule 放回到装饰器中(如上所示)时,decorator Defined 在启动时打印,但当我调用 GET/status 时code> 时,它不会打印 Hello ,就好像 app.add_url_rule 覆盖了我以某种方式定义的 wrapper() 函数。

为什么会发生这种情况?看起来 app.add_url_route 以某种奇怪/意外的方式劫持了我的函数。

在装饰器中定义 app.add_url_rule 时,如何在命中路由后调用 wrapper()

最佳答案

您使用 Flask 注册了原始函数,而不是包装器。每当路由匹配时,Flask 都会调用 f,而不是 wrapper,因为那是您为路由注册的内容。

告诉 Flask 在路由匹配时调用 wrapper,而是:

def route(route, method):
def decorator(f):
print 'decorator defined'
print 'defining route'
@wraps(f)
def wrapper(*args, **kwargs):
print 'Hello'
# do stuff here such as authenticate, authorise, check request json/arguments etc.
# these will get passed along with the route and method arguments above.
return f(*args, **kwargs)

app.add_url_rule(route, methods=method, view_func=wrapper)
print 'route defined'
return wrapper
return decorator

关于python - Flask app.add_url_rule 装饰器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23065247/

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