【问题标题】:Flask lost client's post responseFlask 丢失了客户的回复
【发布时间】: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


【解决方案1】:

我认为你的装饰器有错误。 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-12-10
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-17
    • 2017-02-23
    • 2018-10-19
    • 2011-05-30
    相关资源
    最近更新 更多