視圖函數的返回值會被自動轉換為一個響應對象,Flask的轉換邏輯如下:
如果返回的是一個合法的響應對象,則直接返回
可以使用make_response函數來創建Response對象,這個方法可以設置額外的數據,比如cookie、header信息等
... from flask import make_response @app.route('/about/') def about(): return make_response('about page')
如果返回的是一個字符串,那么Flask會重新創建一個werkzeug.wrappers.Response對象,Response將該字符串作為主體,狀態碼為200,MIME類型為text/html,然后返回該Response對象
@app.route('/about/') def about(): return 'about page'
轉換為
... from werkzeug.wrappers import Response @app.route('/about/') def about(): resp = Response(response='about page ', status=200, content_type='text/html;charset=utf8') return resp
如果返回的是一個元組,元組中的數據類型是(response,status,headers)。status會覆蓋默認的200狀態碼,headers可以是一個列表或者字典作為額外的消息頭
@app.route('/about/') def about(): return 'about page', 200, {'server':'heboan'}
如果以上條件都不滿足,Flask會假設返回值是一個合法的WSGI應用程序,並通過Response.force_type(rv,request.environ)轉換為一個請求對象
我們嘗試返回一個字典,字典不滿足上面的三個條件,因此進入第4步,但是字典也不是一個合法的WSGI應用程序,因此不是一個可請求對象。產生異常!
@app.route('/about/') def about(): return {'name':'heboan'}
如果我們想把所有的URL都發送 JSON數據,那么我們就可以執行響應
自定義響應必須滿足3個條件
1、必須繼承Response類
2、實現類方法force_type(cls, response, environ=None)
3、必須制定app.response_class為你定義的Response
我們可以定義一個叫做JSONResponse的類來代替Flask自帶的Response類
... from werkzeug.wrappers import Response from flask import jsonify 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('/about/') def about(): return {'name':'heboan'}