与Flask连接丢失响应的问题

尼再采 发布于 2013/11/15 10:12
阅读 1K+
收藏 0

先描述一下问题的现象,假设有一条视图函数如下:

@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()的装饰器,目的是在程序进入check_somgthing()主函数之前检查一下条件,装饰器函数如下:

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

我使用的是安卓手机客户端和网页的方式测试的:
手机GET:‘cat’路由OK,‘dog’路由OK
网页GET:‘cat’路由OK,‘dog’路由OK
手机POST:‘cat’路由OK,‘dog’路由失败

网页POST:不会网页,未验证

手机POST方式‘dog’路由迟迟未收到结果,导致响应超时,但是看服务器log信息,发现早已经响应过了。对此,非常的不解???

我先说一下个人的一些推测:
     1.是由装饰器造成的 因为Flask在route装饰时会记录下被装饰函数信息,所以我们在使用check_something()装饰的时候同样加了functools.wraps(f)来保持函数特性,但是装饰器在执行check_something(check='dog')的时候,并没有执行到f(*args, **kwargs),因此,会丢失被装饰函数的特性,导致无法响应。
     2.推测1无法解释为啥get方式能够获取成功,因此,问题也有可能出现在Flask和POST之间
    仅仅是个人推测,非常奇怪的问题,也有可能是我经验不足,希望知晓原因的人能够帮助一下。谢谢。
加载中
0
李学明
李学明

你确定你的程序能跑起来?

首先装饰器写得有问题,少了两个return,其次:jsonify的参数不对,修改后的check_something如下:注意最后的两个return

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 decorator

尼再采
回复 @李学明 : 是 curl -d "" http:ip/dog/ 这种方式吗?这样测的可行,可是我一加参数就不行了,比如 curl -d "id=id&name=dfs" http://ip/dog/
李学明
李学明
回复 @尼再采 : 我用curl测试的,没有问题
尼再采
@李学明 执行@check_something(check='dog')的时候,POST方式,客户端会接收不到任何响应,直接导致socket超时。您测试的是正常得到响应的吗?
尼再采
回复 @李学明 : 请问您实际测试了吗?
李学明
李学明
回复 @尼再采 : 修改后,post, get都是没有问题的
下一页
0
李学明
李学明

引用来自“李学明”的答案

你确定你的程序能跑起来?

首先装饰器写得有问题,少了两个return,其次:jsonify的参数不对,修改后的check_something如下:注意最后的两个return

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 decorator

没有问题啊

尼再采
这就太奇怪了,我在服务器上做的测试依然是超时,这样的结果看来直接导向我服务器相对复杂的环境中去了,没头绪了。。。。纠结
返回顶部
顶部