Flask功能装饰器在定义时间和通话时间运行?

时间:2015-08-05 01:29:40

标签: python authentication flask decorator execution

我试图在Flask中实现装饰器功能,它执行两件事:注册页面路由并在定义时将一些内容添加到我的数据库中,然后在运行时,当向页面发出请求时处理用户是否经过身份验证。

我知道我可以在两个独立的装饰器功能中执行这些功能,但这不会起作用,因为我最终需要在定义时处理同一组信息(应用程序,规则,访问组等)和运行时。

以下代码是我一直在搞乱的,但是我无法让它工作。它编译,你可以看到"定义时间"在控制台和"索引"在浏览器中,但是"运行时"从来没有打印过。任何人都可以建议我做错了吗?

from flask import Flask
from functools import wraps

app = Flask(__name__)


def register(app, rule, **options):
    def wrapper(f):
        print "Definition time"
        endpoint = options.pop('endpoint', f.__name__)
        access_groups = options.pop('access_groups', None)
        methods = options.get('methods', ['GET'])

        app.add_url_rule(rule, endpoint, f, **options)

        @wraps(f)
        def wrapped(*args, **kwargs):
            print "Runtime"
            return f(*args, **kwargs)
        return wrapped

    return wrapper


@register(app, '/', methods=['GET', 'POST'], access_groups=['all-access'])
def index():
    return "index"

if __name__ == '__main__':
    app.run(debug=True)

1 个答案:

答案 0 :(得分:1)

您在add_url_rule中添加了原始函数,而不是包装函数。将add_url_rule移到wrapped下方并更改目标。

def wrapped(...)
    ...

app.add_url_rule(rule, endpoint, wrapped, **options)
return wrapped

这是运行和访问时控制台上的完整代码和输出。

from functools import wraps
from flask import Flask

app = Flask(__name__)

def register(app, rule, **options):
    def wrapper(f):
        print('Definition time')
        endpoint = options.pop('endpoint', f.__name__)
        access_groups = options.pop('access_groups', None)
        methods = options.pop('methods', ['GET'])

        @wraps(f)
        def wrapped(*args, **kwargs):
            print('Runtime')
            return f(*args, **kwargs)

        app.add_url_rule(rule, endpoint, wrapped, **options)
        return wrapped

    return wrapper

@register(app, '/', methods=['GET', 'POST'], access_groups=['all-access'])
def index():
    return 'index'

if __name__ == '__main__':
    app.run(debug=True)
$ python example.py 
Definition time
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
Runtime
127.0.0.1 - - [04/Aug/2015 20:14:46] "GET / HTTP/1.1" 200 -