詳談在flask中使用jsonify和json.dumps的區(qū)別
flask提供了jsonify函數(shù)供用戶處理返回的序列化json數(shù)據(jù),而python自帶的json庫(kù)中也有dumps方法可以序列化json對(duì)象,那么在flask的視圖函數(shù)中return它們會(huì)有什么不同之處呢?
想必開(kāi)始很多人和我一樣搞不清楚,只知道既然框架提供了方法就用,肯定不會(huì)錯(cuò)。
但作為開(kāi)發(fā)人員,我們需要弄清楚開(kāi)發(fā)過(guò)程中各種實(shí)現(xiàn)方式的特點(diǎn)和區(qū)別,這樣在我們面對(duì)不同的需求時(shí)才能做出相對(duì)合理的選擇,而不是千篇一律地使用自己熟悉的。下面我就jsonify和json.dumps的區(qū)別這一問(wèn)題簡(jiǎn)單探討一下。
一、實(shí)驗(yàn)
python的flask框架為用戶提供了直接返回包含json格式數(shù)據(jù)響應(yīng)的方法,即jsonify,在開(kāi)發(fā)中會(huì)經(jīng)常用到。如下一段簡(jiǎn)單的flask后端代碼,服務(wù)端視圖函數(shù)根據(jù)請(qǐng)求參數(shù)返回json格式的數(shù)據(jù)到客戶端。
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形式的參數(shù),如jsonify(name=name,words=words) if __name__ == '__main__': app.run()
用chrome瀏覽器訪問(wèn)得到的頁(yè)面如下圖:
現(xiàn)在我們改為使用python自帶的json庫(kù)json.dumps作為視圖函數(shù)的直接返回值,代碼如下:
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的結(jié)果是可行的,因?yàn)閒lask會(huì)判斷并使用make_response方法自動(dòng)構(gòu)造出響應(yīng),只不過(guò)響應(yīng)頭各個(gè)字段是默認(rèn)的。若要自定義響應(yīng)字段,則可以使用make_response或Response自行構(gòu)造響應(yīng)。用chrome訪問(wèn)的響應(yīng)頁(yè)面如下圖。
二、分析
1.Content-Type有區(qū)別
jsonify的作用實(shí)際上就是將我們傳入的json形式數(shù)據(jù)序列化成為json字符串,作為響應(yīng)的body,并且設(shè)置響應(yīng)的Content-Type為application/json,構(gòu)造出響應(yīng)返回至客戶端。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實(shí)際上也是使用了json.dumps來(lái)序列化json形式的數(shù)據(jù),作為響應(yīng)正文返回。indent表示json格式化的縮進(jìn),若是Ajax請(qǐng)求則不縮進(jìn)(因?yàn)橐话鉇jax數(shù)據(jù)沒(méi)必要直接展示),否則縮進(jìn)2格。但想必從第一部分的實(shí)驗(yàn)結(jié)果我們已經(jīng)看出來(lái)了,使用jsonify時(shí)響應(yīng)的Content-Type字段值為application/json,而使用json.dumps時(shí)該字段值為text/html。Content-Type決定了接收數(shù)據(jù)的一方如何看待數(shù)據(jù),如何處理數(shù)據(jù),如果是application/json,則可以直接當(dāng)做json對(duì)象處理,若是text/html,則還要將文本對(duì)象轉(zhuǎn)化為json對(duì)象再做處理(個(gè)人理解,有誤請(qǐng)指正)。
2.接受參數(shù)有區(qū)別
jsonify可以接受和python中的dict構(gòu)造器同樣的參數(shù),如下圖。
而json.dumps比jsonify可以多接受list類(lèi)型和一些其他類(lèi)型的參數(shù)。但我試了一下,形式為key1=value1,[key2=value2,...]這樣的參數(shù)是不行的,會(huì)報(bào)出“TypeError: dumps() takes exactly 1 argument (0 given)”這一錯(cuò)誤,而jsonify不會(huì)報(bào)錯(cuò)并能正常返回?cái)?shù)據(jù)。
最后,我們可以使用flask中的make_response方法或者直接通過(guò)Response類(lèi),通過(guò)設(shè)置mimetype參數(shù)來(lái)達(dá)到和使用jsonify差不多的效果,但少寫(xiě)點(diǎn)代碼何樂(lè)而不為呢?況且簡(jiǎn)潔一點(diǎn)更不容易出錯(cuò),參數(shù)越多調(diào)試和維護(hù)就越麻煩。當(dāng)然,使用哪個(gè)并不是絕對(duì)的,必要時(shí)要根據(jù)前端的數(shù)據(jù)處理方式來(lái)決定。
更多關(guān)于jsonify的知識(shí)請(qǐng)參考官方文檔:http://flask.pocoo.org/docs/0.12/api/#module-flask.json
更多關(guān)于json.dumps的知識(shí)參考官方文檔:https://docs.python.org/2/library/json.html#module-json
以上這篇詳談在flask中使用jsonify和json.dumps的區(qū)別就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
最新解決沒(méi)有NVSMI文件夾以及nvidia-smi‘?不是內(nèi)部或外部命令也不是可運(yùn)行的程序或批處理文件
這篇文章主要介紹了解決沒(méi)有NVSMI文件夾以及nvidia-smi‘?不是內(nèi)部或外部命令也不是可運(yùn)行的程序或批處理文件,本文通過(guò)兩種問(wèn)題分析給大家分享解決方法,需要的朋友可以參考下2023-01-01使用Python編寫(xiě)文件重復(fù)檢查器的完整代碼
在日常工作中,我們經(jīng)常需要處理大量文件,但有時(shí)候會(huì)遇到文件重復(fù)的情況,為了有效管理文件并避免重復(fù)占用存儲(chǔ)空間,我們可以編寫(xiě)一個(gè)簡(jiǎn)單的Python程序來(lái)檢查文件夾中是否存在重復(fù)文件,本文將介紹如何使用Python和其庫(kù)來(lái)編寫(xiě)一個(gè)文件重復(fù)檢查器2024-08-08在Python下利用OpenCV來(lái)旋轉(zhuǎn)圖像的教程
這篇文章主要介紹了在Python下利用OpenCV來(lái)旋轉(zhuǎn)圖像的教程,代碼和核心的算法都非常簡(jiǎn)單,需要的朋友可以參考下2015-04-04Python使用SocketServer模塊編寫(xiě)基本服務(wù)器程序的教程
SocketServer模塊中集成了實(shí)現(xiàn)socket通信服務(wù)器功能所需的各種類(lèi)和方法,這里我們就來(lái)看一下Python使用SocketServer模塊編寫(xiě)基本服務(wù)器程序的教程:2016-07-07tensorflow之讀取jpg圖像長(zhǎng)和寬實(shí)例
這篇文章主要介紹了tensorflow之讀取jpg圖像長(zhǎng)和寬實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06Python?selenium?webdriver?基本使用代碼分享
這篇文章主要介紹了Python?selenium?webdriver?基本使用,本文僅僅簡(jiǎn)單介紹了selenium的使用常用代碼分享,需要的朋友可以參考下2022-11-11Python+selenium實(shí)現(xiàn)瀏覽器基本操作詳解
這篇文章主要為大家詳細(xì)介紹了如何通過(guò)python腳本實(shí)現(xiàn)瀏覽器的一些基本操作,如:瀏覽器的前進(jìn)后退、頁(yè)面刷新等,感興趣的可以學(xué)習(xí)一下2022-06-06flask SQLAlchemy連接數(shù)據(jù)庫(kù)及操作的實(shí)現(xiàn)
本文主要介紹了flask SQLAlchemy連接數(shù)據(jù)庫(kù)及操作的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03