今天先來學習一下Response
的相關知識。
所有返回前台的內容其實都應該是Response
的對象或者其子類,我們看到如果返回的是字符串直接可以寫成return u'字符串內容'
的形式,但是其實這個字符串也是經過了Response
包裝的:returnResponse(u'字符串')
我們看一段代碼:
# coding: utf-8from flask import Flask, Response app = Flask(__name__) # type: Flaskapp.debug = True@app.route('/')def hello_world(): return 'Hello World!'@app.route('/login/')def login(): return Response(u'login')if __name__ == '__main__': app.run()
代碼里我新建了一個login
函數,返回的就是用Response
包裝后的字符串,訪問地址可以看到頁面打印了login
。
我們有時候需要返回數組、字典之類的數據,但是數組或者字典這些數據是不能直接return
的。這個時候怎么辦呢?答案就是你必須將數組或字典轉換成json
后再返回(這就是為什么我們做接口測試的時候傳參前用json.loads()
將字符串轉換成字典的原因了),因為json
就是一個字符串。
數組或字典轉換成json
的函數叫做jsonify
,你需要先導入from flask import jsonify
或者像下面代碼里寫的那樣,一下子導入好幾個庫:
# coding: utf-8from flask import Flask, Response, jsonify app = Flask(__name__) # type: Flaskapp.debug = True@app.route('/')def hello_world(): return 'Hello World!'@app.route('/login/')def login(): dict1 = {"name": "Warren"} return jsonify(dict1)if __name__ == '__main__': app.run()
上面代碼里dict1
的數據類型是一個字典,我們通過jsonify()
將其轉換成了json
,就可以成功返回了,去頁面,看到:

除了字符串以外,還可以返回元組
,但是返回元組是有要求的,元組內容包括三個參數:response
、status_code
、headers
,其中:
-
response
指頁面打印信息,可以是字符串或Response
對象 -
status_code
指狀態碼,成功200
,找不到頁面404
等等 -
headers
指信息頭
# coding: utf-8from flask import Flask, Response, jsonify app = Flask(__name__) # type: Flaskapp.debug = True@app.route('/')def hello_world(): return 'Hello World!'@app.route('/login/')def login(): dict1 = {"name": "Warren"} return jsonify(dict1)@app.route('/set/')def myset(): return u'返回元組', 200, {"name": "Warren"}if __name__ == '__main__': app.run()
看上面代碼的myset
函數,我return
了一個元組(單個值的元組可以不寫括號,而且如果你加上括號,pycharm會有黃線提醒你remove redundant parentheless
,意思就是去掉多余的括號)。然后我們到頁面訪問/set/
這個頁面,打開F12就是開發者工具,然后刷新頁面:

然后看開發者工具:

接下來介紹自定義返回對象:
現在我們假定有一個需求:所有的視圖函數都要返回json格式的對象
我們先看一下Response
的源碼:

發現只有一行default_mimetype='text/html'
,所以我們需要重寫Response
類;當然我們需要知道常用的數據類型:
-
text/html(默認的,html文件)
-
text/plain(純文本)
-
text/css(css文件)
-
text/javascript(js文件)
-
application/x-www-form-urlencoded(普通的表單提交)
-
multipart/form-data(文件提交)
-
application/json(json傳輸)
-
application/xml(xml文件)
如果對軟件測試、接口測試、自動化測試、面試經驗交流。感興趣可以加軟件測試交流:1085991341,還會有同行一起技術交流。
# coding: utf-8from flask import Flask, Response, jsonify app = Flask(__name__) # type: Flaskapp.debug = True@app.route('/')def hello_world(): return 'Hello World!'@app.route('/login/')def login(): dict1 = {"name": "Warren"} return jsonify(dict1) @app.route('/set/')def myset(): return u'返回元組', 200, {"name": "Warren"}class JSONResponse(Response): default_mimetype = 'application/json' @classmethod def force_type(cls, response, environ=None): if isinstance(response, dict): response = jsonify(response) return super(JSONResponse, cls).force_type(response, environ)# 這個方法也需要注冊app.response_class = JSONResponse@app.route('/jsontext/')def jsontext(): return {"name": "Warren"}if __name__ == '__main__': app.run()
代碼說明,以上代碼重寫了force_type
方法,那么什么時候代碼會調用force_type
方法呢?如果返回的字符串不符合下面三種數據類型,就會調用該方法,這三種數據類型是字符串
、元組
、response
。
上面代碼里jsontext
函數直接返回dict
類型數據,本來是不可以的,但是因為我們重寫了force_type
方法,現在這個函數就可以直接返回這個數據了:

以上內容希望對你有幫助,有被幫助到的朋友歡迎點贊,評論。