国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

詳談在flask中使用jsonify和json.dumps的區別

2020-02-22 23:33:48
字體:
來源:轉載
供稿:網友

flask提供了jsonify函數供用戶處理返回的序列化json數據,而python自帶的json庫中也有dumps方法可以序列化json對象,那么在flask的視圖函數中return它們會有什么不同之處呢?

想必開始很多人和我一樣搞不清楚,只知道既然框架提供了方法就用,肯定不會錯。

但作為開發人員,我們需要弄清楚開發過程中各種實現方式的特點和區別,這樣在我們面對不同的需求時才能做出相對合理的選擇,而不是千篇一律地使用自己熟悉的。下面我就jsonify和json.dumps的區別這一問題簡單探討一下。

一、實驗

python的flask框架為用戶提供了直接返回包含json格式數據響應的方法,即jsonify,在開發中會經常用到。如下一段簡單的flask后端代碼,服務端視圖函數根據請求參數返回json格式的數據到客戶端。

from flask import Flaskfrom flask import jsonifyfrom flask import Responseapp = Flask(__name__)@app.route('/hello/<name>/<words>',methods=['GET'])def hello(name,words): return jsonify({'name':name,'words':words})#也可以傳入key=value形式的參數,如jsonify(name=name,words=words)if __name__ == '__main__': app.run()

用chrome瀏覽器訪問得到的頁面如下圖:

現在我們改為使用python自帶的json庫json.dumps作為視圖函數的直接返回值,代碼如下:

from flask import Flaskfrom flask import jsonifyfrom flask import Responseapp = Flask(__name__)@app.route('/hello/<name>/<words>',methods=['GET'])def hello(name,words): return json.dumps({'name':name,'words':words})if __name__ == '__main__': app.run()

PS: 直接返回json.dumps的結果是可行的,因為flask會判斷并使用make_response方法自動構造出響應,只不過響應頭各個字段是默認的。若要自定義響應字段,則可以使用make_response或Response自行構造響應。用chrome訪問的響應頁面如下圖。

二、分析

1.Content-Type有區別

jsonify的作用實際上就是將我們傳入的json形式數據序列化成為json字符串,作為響應的body,并且設置響應的Content-Type為application/json,構造出響應返回至客戶端。jsonify的部分源碼如下:

def jsonify(*args, **kwargs): if __debug__: _assert_have_json() return current_app.response_class(json.dumps(dict(*args, **kwargs), indent=None if request.is_xhr else 2), mimetype='application/json')

可以看出jsonify實際上也是使用了json.dumps來序列化json形式的數據,作為響應正文返回。indent表示json格式化的縮進,若是Ajax請求則不縮進(因為一般Ajax數據沒必要直接展示),否則縮進2格。但想必從第一部分的實驗結果我們已經看出來了,使用jsonify時響應的Content-Type字段值為application/json,而使用json.dumps時該字段值為text/html。Content-Type決定了接收數據的一方如何看待數據,如何處理數據,如果是application/json,則可以直接當做json對象處理,若是text/html,則還要將文本對象轉化為json對象再做處理(個人理解,有誤請指正)。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 彩票| 济源市| 桐梓县| 蚌埠市| 翁源县| 静宁县| 若尔盖县| 郯城县| 达尔| 朝阳市| 沂南县| 屏南县| 涡阳县| 古丈县| 河源市| 永安市| 葵青区| 潍坊市| 高要市| 高密市| 盈江县| 桦南县| 泸西县| 玉田县| 太湖县| 石狮市| 乌拉特中旗| 邛崃市| 晋城| 永泰县| 滨海县| 米易县| 宿迁市| 竹溪县| 壤塘县| 乐平市| 合川市| 平南县| 荥经县| 乳源| 镇坪县|