假设有一个功能视图如下:
@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之间存在一些问题。我猜也是。
有人能给我一些帮助吗?谢谢!
答案 0 :(得分:0)
我认为你的装饰师有错误。 f是正在装饰的功能,如果有的话 是一个测试f没有被执行。更正后的版本:
print('check_start')
if check == 'dog':
ctx = f(*args, **kwargs)
return jsonify( ret='check dog' )
else:
ctx = f(*args, **kwargs)
return jsonify( ret=ctx