假设有一个视图的函数如下:
@app.route('/cat/', methods=('GET', 'POST'))
@check_something(check='cat')
def cat():
print 'cat'
return 'cat'
@app.route('/dog/', methods=('GET', 'POST'))
@check_something(check='dog')
def dog():
print 'dog'
return 'dog'
在这里,我使用了一个名为 check_something() 的装饰器,我要做的是在执行 mainfanction 之前检查条件。装饰器功能代码为:
def check_something(check=''):
def decorator(f):
@functools.wraps(f)
def decorated_function(*args, **kwargs):
print('check_start')
if check == 'dog':
return jsonify( ret='check dog' )
else:
ctx = f(*args, **kwargs)
return jsonify( ret=ctx )
return decorated_function
return decoration
我从android客户端和web客户端测试它,下面是测试结果:
Android + GET: route 'cat' is OK, route 'dog' is OK;
Web + GET : route 'cat' is OK, route 'dog' is OK;
Android +POST: route 'cat' is OK, route 'dog' is Failed, raise SocketTimeoutException;
Web + POST: i didn't test it.
为什么?太奇怪了!
说一下个人的一些猜测。
1.是装修工造成的。*Flask 的装饰器@app.route() 将记录被装饰的函数。所以我添加了 functools.wraps(f) 来保持函数的特性。但是当程序执行 check_something(check='dog') 时,并没有执行 f(*args, **kwargs),所以烧瓶失去了修饰函数的特性。所以烧瓶失去反应。我猜。
2.为什么GET可以执行成功?也许 Flask 和 POST 之间存在一些问题。我猜也是
谁能给我一些帮助?谢谢!