檢視函式Response返回值詳解
阿新 • • 發佈:2018-12-10
# response筆記: ### 檢視函式中可以返回哪些值: 1. 可以返回字串:返回的字串其實底層將這個字串包裝成了一個`Response`物件。 2. 可以返回元組:元組的形式是(響應體,狀態碼,頭部資訊),也不一定三個都要寫,寫兩個也是可以的。返回的元組,其實在底層也是包裝成了一個`Response`物件。 3. 可以返回`Response`及其子類。 ### 實現一個自定義的`Response`物件: 1. 繼承自`Response`類。 2. 實現方法`force_type(cls,rv,environ=None)`。 3. 指定`app.response_class`為你自定義的`Response`物件。 4. 如果檢視函式返回的資料,不是字串,也不是元組,也不是Response物件,那麼就會將返回值傳給`force_type`,然後再將`force_type`的返回值返回給前端。
from flask import Flask,Response,jsonify,render_template # flask = werkzeug+sqlalchemy+jinja2 import json app = Flask(__name__) # 將檢視函式中返回的字典,轉換成json物件,然後返回 # restful-api class JSONResponse(Response): @classmethod def force_type(cls, response, environ=None): """ 這個方法只有檢視函式返回非字元、非元組、非Response物件 才會呼叫 response:檢視函式的返回值 """ if isinstance(response,dict): # jsonify除了將字典轉換成json物件,還將改物件包裝成了一個Response物件 response = jsonify(response) return super(JSONResponse, cls).force_type(response,environ) app.response_class = JSONResponse @app.route('/') def hello_world(): # Response('Hello World!',status=200,mimetype='text/html') return 'Hello World!' @app.route('/list1/') def list1(): resp = Response('list1') resp.set_cookie('country','china') return resp @app.route('/list2/') def list2(): return 'list2',200,{'X-NAME':'zhiliao'} @app.route('/list3/') def list3(): return {'username':'zhiliao','age':18} if __name__ == '__main__': app.run(debug=True,port=8000)