Python Flask app.add_url_装饰程序中的规则错误

Python Flask app.add_url_装饰程序中的规则错误,python,flask,werkzeug,Python,Flask,Werkzeug,我的烧瓶路线中有一堆装饰器,我正试图将它们浓缩成一个(包括@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_f

我的烧瓶路线中有一堆装饰器,我正试图将它们浓缩成一个(包括
@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\u rule
到文件末尾时,调用
wrapper()
;因此,
decoratordefined
语句在Flask启动时打印,
Hello
在我按预期点击
GET/status
路径时打印

但是,当我将
app.add\u url\u rule
放回decorator(如上所示)时,
decorator defined
会在启动时打印,但当我调用
GET/status
时,它不会打印
Hello
,就好像
app.add\u url\u rule
覆盖了我以某种方式定义的
包装器()
函数一样

为什么会发生这种情况?它看起来像是
app.add\u url\u route
以某种奇怪/意外的方式劫持了我的功能

在decorator中定义
app.add\url\u 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是否会存储一个不同的包装,然后调用适当的
f
?@Nayefc:您的装饰程序会为每个装饰的
f
创建一个不同的包装,所以是的。