1. 程式人生 > >檢視函式Response返回值詳解

檢視函式Response返回值詳解

# 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)