Flask 的 jsonify知識

首先咱們來看一段 Python 代碼html

from flask import Flask, jsonifypython

app = Flask(name)json

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'
}
]flask

@app.route('/api/v1.0/tasks', methods=['GET'])
def get_tasks():
return jsonify({'tasks': tasks})api

if name == 'main':
app.run(debug=True)
在這段代碼裏面,咱們看到了今天的主角 jsonify。瀏覽器

Flask 框架裏,能夠用 jsonify 返回 json 數據,可是爲何不用 Python 自帶的 json 模塊返回 JSON 數據呢?app

實際上是同樣
其實,jsonify 在處理數據過程當中,對數據作 JSON 序列化處理時,用的是 itsdangerous 模塊裏的 JSON ,讓咱們看一下,這個模塊裏的 JSON 是如何引入的框架

try:
import simplejson as json
except ImportError:
import json
它會先嚐試引入simplejson,若是沒有安裝這個模塊,則引入 Python 原生模。ide

在Flask框架中,引入過程以下debug

from itsdangerous import json as _json
對於數據的序列化處理,用的正是 _json.

Content-Type 的差異
前面講到,jsonify 和 json 是異曲同工,那麼爲何要費周折繞這麼一圈呢?

確定存在一個合理的緣由讓 jsonify存在的有意義。

這個緣由就是 Content-Type

看下面兩段代碼

第一段代碼

jsonify

import json
from flask import Flask, jsonify

app = Flask(name)

@app.route('/json')
def test_json():
data = {'name': 'lilei', 'age': 30}
return jsonify(data)

app.run(host="0.0.0.0", port=9877)
在瀏覽器裏輸入http://127.0.0.1:9877/json, 獲得的結果是

{"age":30,"name":"lilei"}
第二段代碼:

json

import json
from flask import Flask, jsonify

app = Flask(name)

@app.route('/json')
def test_json():
data = {'name': 'lilei', 'age': 30}
return json.dumps(data)

app.run(host="0.0.0.0", port=9877)
在瀏覽器裏輸入http://127.0.0.1:9877/json, 獲得的結果是

{"name": "lilei", "age": 30}
從內容上看,兩種方法沒有區別。
可是使用 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 協議的規定的,這就是使用 jsonify 的緣由之一。

減少數據量
使用 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 裏就是這麼幹的。

做者:You的平常
連接:https://www.jianshu.com/p/a25357f2d930來源:簡書著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。

相關文章
相關標籤/搜索