4

假设有一个视图的函数如下:

@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 之间存在一些问题。我猜也是

谁能给我一些帮助?谢谢!

4

1 回答 1

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 
于 2014-04-08T11:25:00.177 回答