我试图在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)
答案 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 -