Python 的装饰器执行顺序问题(二)
2019獨角獸企業重金招聘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']) @testwra def get_users():return ['33', '44']再次執行,在輸入/users網址之前,便會依次輸出testwra和end,緊接著輸入網址之后,便會輸出wra,然后在網頁上便能看到執行結果如下圖所示。
執行結果:
三、問題回顧
要想在輸入users之后,正常對['33', '44']進行序列化并進行顯示,應將@testwra裝飾器放在@app.route裝飾器之后才有效。這個時候輸入網址route到相應的處理函數時,get_users已經經過testwra序列化處理,所以便能夠正常顯示序列化后的["33", "44"]。
轉載于:https://my.oschina.net/u/3636678/blog/2209450
總結
以上是生活随笔為你收集整理的Python 的装饰器执行顺序问题(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: org.apache.poi 读取数字问
- 下一篇: python全栈之nginx安装