91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-09-03 20:57:45 來源:腳本之家 閱讀:142 作者:Duke_Huan_of_Qi 欄目:開發技術

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

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

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

一、實驗

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

from flask import Flask
from flask import jsonify
from flask import Response
app = 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瀏覽器訪問得到的頁面如下圖:

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

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

from flask import Flask
from flask import jsonify
from flask import Response
app = 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訪問的響應頁面如下圖。

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

二、分析

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對象再做處理(個人理解,有誤請指正)。

2.接受參數有區別

jsonify可以接受和python中的dict構造器同樣的參數,如下圖。

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

而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

以上這篇詳談在flask中使用jsonify和json.dumps的區別就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

和林格尔县| 新丰县| 波密县| 潍坊市| 隆安县| 扬中市| 吕梁市| 弥渡县| 康平县| 汶川县| 探索| 桦甸市| 阳西县| 礼泉县| 突泉县| 沭阳县| 偃师市| 岱山县| 将乐县| 江永县| 南阳市| 昌邑市| 红原县| 溧阳市| 柳林县| 临泽县| 独山县| 金门县| 荃湾区| 齐河县| 沿河| 崇州市| 穆棱市| 叶城县| 滨海县| 巴塘县| 故城县| 长泰县| 江川县| 麦盖提县| 金溪县|