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"]。