最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳談在flask中使用jsonify和json.dumps的區(qū)別

 更新時間:2018年03月26日 15:18:27   作者:Duke_Huan_of_Qi  
下面小編就為大家分享一篇詳談在flask中使用jsonify和json.dumps的區(qū)別,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

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

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

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

一、實驗

python的flask框架為用戶提供了直接返回包含json格式數(shù)據(jù)響應(yīng)的方法,即jsonify,在開發(fā)中會經(jīng)常用到。如下一段簡單的flask后端代碼,服務(wù)端視圖函數(shù)根據(jù)請求參數(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瀏覽器訪問得到的頁面如下圖:

現(xiàn)在我們改為使用python自帶的json庫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é)果是可行的,因為flask會判斷并使用make_response方法自動構(gòu)造出響應(yīng),只不過響應(yīng)頭各個字段是默認(rèn)的。若要自定義響應(yīng)字段,則可以使用make_response或Response自行構(gòu)造響應(yīng)。用chrome訪問的響應(yīng)頁面如下圖。

二、分析

1.Content-Type有區(qū)別

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

2.接受參數(shù)有區(qū)別

jsonify可以接受和python中的dict構(gòu)造器同樣的參數(shù),如下圖。

而json.dumps比jsonify可以多接受list類型和一些其他類型的參數(shù)。但我試了一下,形式為key1=value1,[key2=value2,...]這樣的參數(shù)是不行的,會報出“TypeError: dumps() takes exactly 1 argument (0 given)”這一錯誤,而jsonify不會報錯并能正常返回數(shù)據(jù)。

最后,我們可以使用flask中的make_response方法或者直接通過Response類,通過設(shè)置mimetype參數(shù)來達(dá)到和使用jsonify差不多的效果,但少寫點代碼何樂而不為呢?況且簡潔一點更不容易出錯,參數(shù)越多調(diào)試和維護(hù)就越麻煩。當(dāng)然,使用哪個并不是絕對的,必要時要根據(jù)前端的數(shù)據(jù)處理方式來決定。

更多關(guān)于jsonify的知識請參考官方文檔:http://flask.pocoo.org/docs/0.12/api/#module-flask.json

更多關(guān)于json.dumps的知識參考官方文檔:https://docs.python.org/2/library/json.html#module-json

以上這篇詳談在flask中使用jsonify和json.dumps的區(qū)別就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 對python實現(xiàn)二維函數(shù)高次擬合的示例詳解

    對python實現(xiàn)二維函數(shù)高次擬合的示例詳解

    今天小編就為大家分享一篇對python實現(xiàn)二維函數(shù)高次擬合的示例詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • python處理SQLite數(shù)據(jù)庫的方法

    python處理SQLite數(shù)據(jù)庫的方法

    這篇文章主要介紹了python處理SQLite數(shù)據(jù)庫的方法,python處理數(shù)據(jù)庫非常簡單。而且不同類型的數(shù)據(jù)庫處理邏輯方式大同小異。本文以sqlite數(shù)據(jù)庫為例,介紹一下python操作數(shù)據(jù)庫的方,需要的朋友可以參考下,希望能幫助到大家
    2022-02-02
  • python逆向之pyc反編譯的使用教程

    python逆向之pyc反編譯的使用教程

    python代碼的運行是靠python解析器將源代碼轉(zhuǎn)換為字節(jié)碼,本文主要介紹了python逆向之pyc反編譯的使用教程,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • Python3 文章標(biāo)題關(guān)鍵字提取的例子

    Python3 文章標(biāo)題關(guān)鍵字提取的例子

    今天小編就為大家分享一篇Python3 文章標(biāo)題關(guān)鍵字提取的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • python 模塊導(dǎo)入問題匯總

    python 模塊導(dǎo)入問題匯總

    在本篇文章里小編給大家整理的是一篇關(guān)于python 模塊導(dǎo)入問題匯總內(nèi)容,有需要的朋友們可以學(xué)習(xí)參考下。
    2021-02-02
  • Python數(shù)據(jù)可視化常用4大繪圖庫原理詳解

    Python數(shù)據(jù)可視化常用4大繪圖庫原理詳解

    這篇文章主要介紹了Python數(shù)據(jù)可視化常用4大繪圖庫原理詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-10-10
  • 基于PyQt5制作一個動態(tài)指針時鐘

    基于PyQt5制作一個動態(tài)指針時鐘

    這篇文章主要和大家分享如何利用Python中的PyQt5制作一個動態(tài)指針時鐘來顯示實時時間,文中的示例代碼講解詳細(xì),需要的可以參考一下
    2022-02-02
  • python如何實現(xiàn)數(shù)組元素兩兩相加

    python如何實現(xiàn)數(shù)組元素兩兩相加

    這篇文章主要介紹了python如何實現(xiàn)數(shù)組元素兩兩相加,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Python selenium抓取虎牙短視頻代碼實例

    Python selenium抓取虎牙短視頻代碼實例

    這篇文章主要介紹了Python selenium抓取虎牙短視頻代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • 使用pipenv管理python虛擬環(huán)境的全過程

    使用pipenv管理python虛擬環(huán)境的全過程

    pipenv 是Kenneth Reitz大神的作品,能夠有效管理Python多個環(huán)境,各種包,接下來通過本文給大家分享使用pipenv管理python虛擬環(huán)境的全過程,感興趣的朋友一起看看吧
    2021-09-09

最新評論

东莞市| 南雄市| 陆良县| 上饶市| 盈江县| 涞水县| 澜沧| 城步| 榆社县| 东城区| 拉孜县| 东明县| 海阳市| 高邮市| 金秀| 新田县| 桃源县| 绥滨县| 焉耆| 华蓥市| 福鼎市| 浑源县| 积石山| 西昌市| 冀州市| 望城县| 庄浪县| 茌平县| 富蕴县| 永登县| 阜宁县| 达州市| 阿克陶县| 北流市| 临西县| 九江县| 昂仁县| 平谷区| 庆元县| 万盛区| 澄江县|