from flask import Flask, jsonify app = Flask(__name__) tasks = [ { 'id': 1, 'title': u'訂閱 python_mastery 專欄', 'description': u'專欄Link: https://xiaozhuanlan.com/python_mastery' }, { 'id': 2, 'title': u'訂閱 pythonml 專欄', 'description': u'專欄Link: https://xiaozhuanlan.com/pythonml' } ] @app.route('/api/v1.0/tasks', methods=['GET']) def get_tasks(): return jsonify({'tasks': tasks}) if __name__ == '__main__': app.run(debug=True)
Flask 框架里,可以用 jsonify
返回 json 數據,但是為什么不用 Python
自帶的 json
模塊返回 JSON 數據呢?
其實,jsonify
在處理數據過程中,對數據做 JSON 序列化處理時,用的是 itsdangerous
模塊里的 JSON ,讓我們看一下,這個模塊里的 JSON 是如何引入的
try: import simplejson as json except ImportError: import json
在Flask框架中,引入過程如下
from itsdangerous import json as _json
對於數據的序列化處理,用的正是_json
.
jsonify
和 json
是殊途同歸,那么為什么要費周折繞這么一圈呢?
肯定存在一個合理的原因讓 jsonify
存在的有意義
1.Content-Type 的差別
但是使用 jsonify
時,返回的 http response
的 Content-Type
是
Content-Type: application/json
而使用json.dumps時,Content-Type則是
Content-Type: text/html; charset=utf-8
既然返回的是 json 數據,那么自然要指明Content-Type
是application/json
, 這樣做是符合 HTTP 協議的規定的,
2. 減小數據量
使用 jsonify
除了讓返回的 `http response符合 HTTP 協議,同時也對數據做了壓縮處理,讓數據體積更小。
仔細比較上面兩種方法返回的數據,雖然內容相同,但 jsonify
返回的數據,每個 key-value
對之間的逗號,和每個 key
與 value
之間的冒號后面都是沒有空格的,而 json.dumps
返回的數據里,卻在逗號和冒號后面存在空格,因此即便內容相同,jsonify
返回的數據體積更小,更節省流量。
其實,json.dumps
也可以將這些不必要的空格去掉,看下面的代碼
import json data = {'name': 'lilei', 'age': 30} print(json.dumps(data, separators=(',', ':'))) print(json.dumps(data))
{"name":"lilei","age":30} {"name": "lilei", "age": 30}
只需要在dumps
參數里指定separators
即可,其實在jsonify
里就是這么干的