flask中使用jsonify和json.dumps的區別
一、實驗
python的flask框架為使用者提供了直接返回包含json格式資料響應的方法,即jsonify,在開發中會經常用到。如下一段簡單的flask後端程式碼,服務端檢視函式根據請求引數返回json格式的資料到客戶端。
1 from flask import Flask
2 from flask import jsonify
3 from flask import Response
4
5
6 app = Flask(__name__)
7
8
9 @app.route('/hello/<name>/<words>',methods=[' GET'])
10 def hello(name,words):
11 return jsonify({'name':name,'words':words})#也可以傳入key=value形式的引數,如jsonify(name=name,words=words)
12
13
14 if __name__ == '__main__':
15 app.run()
用chrome瀏覽器訪問得到的頁面如下圖:
現在我們改為使用python自帶的json庫json.dumps作為檢視函式的直接返回值,程式碼如下:
1 from flask importFlask 2 from flask import jsonify 3 from flask import Response 4 5 6 app = Flask(__name__) 7 8 9 @app.route('/hello/<name>/<words>',methods=['GET']) 10 def hello(name,words): 11 return json.dumps({'name':name,'words':words}) 12 13 14 if __name__ == '__main__': 15 app.run()
PS:直接返回json.dumps的結果是可行的,因為flask會判斷並使用make_response方法自動構造出響應,只不過響應頭各個欄位是預設的。若要自定義響應欄位,則可以使用make_response或Response自行構造響應。用chrome訪問的響應頁面如下圖。
二、分析
1.Content-Type有區別
jsonify的作用實際上就是將我們傳入的json形式資料序列化成為json字串,作為響應的body,並且設定響應的Content-Type為application/json,構造出響應返回至客戶端。jsonify的部分原始碼如下:
1 def jsonify(*args, **kwargs):
2 if __debug__:
3 _assert_have_json()
4 return current_app.response_class(json.dumps(dict(*args, **kwargs),
5 indent=None if request.is_xhr else 2), mimetype='application/json')
2.接受引數有區別
jsonify可以接受和python中的dict構造器同樣的引數,如下圖。
而json.dumps比jsonify可以多接受list型別和一些其他型別的引數。但我試了一下,形式為key1=value1,[key2=value2,...]這樣的引數是不行的,會報出“TypeError: dumps() takes exactly 1 argument (0 given)”這一錯誤,而jsonify不會報錯並能正常返回資料。
最後,我們可以使用flask中的make_response方法或者直接通過Response類,通過設定mimetype引數來達到和使用jsonify差不多的效果,但少寫點程式碼何樂而不為呢?況且簡潔一點更不容易出錯,引數越多除錯和維護就越麻煩。當然,使用哪個並不是絕對的,必要時要根據前端的資料處理方式來決定。
更多關於jsonify的知識請參考官方文件:http://flask.pocoo.org/docs/0.12/api/#module-flask.json
更多關於json.dumps的知識參考官方文件:https://docs.python.org/2/library/json.html#module-json