Flask失去了客户的帖子回复

时间:2013-11-15 05:29:49

标签: python post flask decorator

假设有一个功能视图如下:

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

有人能给我一些帮助吗?谢谢!

1 个答案:

答案 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