【发布时间】:2013-11-28 10:34:03
【问题描述】:
假设有一个函数的视图如下:
@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之间有问题。我猜也是。
谁能帮帮我?谢谢!
【问题讨论】:
-
刚刚尝试了 GET + POST (web),工作正常。有一件事,在 check_something 函数中,最外层的返回应该是返回
decorator而不是decoration。 -
我没有看到您检查请求方法。 (“methods”只指定允许的方法)flask.pocoo.org/docs/0.10/quickstart/#http-methods
标签: python post flask decorator