Python 的装饰器执行顺序问题(二)

1、问题分析python

具体问题可见:Python 的装饰器执行顺序问题json

原代码以下:app

def testwra(func):
    print "testwra"
    def _wrapper():
        print "wra"
        r = func()
        return r
    print "end"
    return _wrapper

@testwra
@app.route('/users', methods=['GET'])
def get_users():
    return ['33', '44']

直接执行,在输入/users网址以前,便会输出testwra和end,紧接着输入网址以后,便会出现下面的错误:函数

分析错误缘由,@testwra装饰器在前面,@app.route装饰器在后面,因此在输入网址route以后执行的是没被testwra装饰的get_users,故而数据并无通过序列化处理,返回到页面的仍然是list。再根据错误提示,返回值必须是字符串,元祖,响应实例,或者是可调用的WSGI,不能是list,因此出错。spa

2、问题解决.net

在前辈帮助下,发现了问题所在,就是装饰器的执行顺序问题。code

修改代码以下(修改了装饰器的顺序,以及将list转为json再输出):blog

def testwra(func):
    print "testwra"
    def _wrapper():
        print "wra"
        r = func()
        return json.dumps(r)
    print "end"
    return _wrapper

@app.route('/users', methods=['GET'])
@testwra
def get_users():
    return ['33', '44']

再次执行,在输入/users网址以前,便会依次输出testwra和end,紧接着输入网址以后,便会输出wra,而后在网页上便能看到执行结果以下图所示。字符串

执行结果:get

3、问题回顾

要想在输入users以后,正常对['33', '44']进行序列化并进行显示,应将@testwra装饰器放在@app.route装饰器以后才有效。这个时候输入网址route到相应的处理函数时,get_users已经通过testwra序列化处理,因此便可以正常显示序列化后的["33", "44"]。

相关文章
相关标签/搜索