當前位置:成語大全網 - 新華字典 - 在flask中使用jsonify和json.dumps的區別

在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構造器同樣的參數,如下圖。

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

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