6、Flask實戰第6天:視圖函數Response返回值


視圖函數的返回值會被自動轉換為一個響應對象,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'}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM