100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > Python 的装饰器执行顺序问题(二)

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

时间:2022-08-15 15:19:08

相关推荐

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

独角兽企业重金招聘Python工程师标准>>>

一、问题分析

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

原代码如下:

def testwra(func):print "testwra"def _wrapper():print "wra"r = func()return rprint "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,所以出错。

二、问题解决

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

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

def testwra(func):print "testwra"def _wrapper():print "wra"r = func()return json.dumps(r)print "end"return _wrapper@app.route('/users', methods=['GET'])@testwradef get_users():return ['33', '44']

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

执行结果:

三、问题回顾

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。