天天看點

Python:Flask請求參數和響應探究一、參數傳遞二、更新參數接收三、傳回參數

一、參數傳遞

測試代碼

# -*- coding: utf-8 -*-

from flask import Flask, request

app = Flask(__name__)


@app.route("/", methods=['POST', 'GET'])
def index():
    print(request.args)
    print(request.form)
    print(request.values)
    print(request.data)
    print(request.json)
    return "ok"


if __name__ == '__main__':
    app.run(debug=True)
      

請求測試

1、發送json資料

POST http://127.0.0.1:5000/?age=12
Content-Type: application/json

{
"name": "Tom"
}      

收到的資料如下

request.args   [('age', '12')]
request.form   []
request.values [('age', '12')]
request.data   b'{\n"name": "Tom"\n}'
request.json   {'name': 'Tom'}      

2、發送form資料

POST http://127.0.0.1:5000/?age=12
Content-Type: application/x-www-form-urlencoded

name=Tom      

收到的資料如下'

request.args  [('age', '12')]
request.form  [('name', 'Tom')]
request.values  [('age', '12'), ('name', 'Tom')]
request.data  b''
request.json  None      

如果

request.args

request.form

資料相同,會優先取

request.args

中的資料

二、更新參數接收

通過測試發現,如果前端沒有傳遞正确的json資料,

request.json

 會傳回一個

None

 ,如果直接取資料會報錯,目前主流的傳參方式是json資料,我們改裝一下:

# -*- coding: utf-8 -*-

from flask import Flask, request, Request


class MyRequest(Request):

    @property
    def json(self):
        """避免json資料未傳遞而傳回 None"""
        try:
            data = self.get_json()
        except Exception as e:
            data = None

        return data or {}

    @property
    def params(self):
        """
        将參數全都放入一個變量
        參數擷取順序 args > form > json
        :return: {dict}
        """
        data = {}

        for key, value in self.args.items():
            data.setdefault(key, value)

        for key, value in self.form.items():
            data.setdefault(key, value)

        for key, value in self.json.items():
            data.setdefault(key, value)

        return data


app = Flask(__name__)
app.request_class = MyRequest


@app.route("/", methods=['POST', 'GET'])
def index():
    print(request.args)
    print(request.form)
    print(request.values)
    print(request.data)
    print(request.json)
    print(request.params)
    return request.params


if __name__ == '__main__':
    app.run(debug=True)
      

MyRequest

類 修改了

json

方法,捕獲了異常,避免傳回

None

報錯,添加了

params

方法,将所有參數都封裝到裡邊,簡化參數擷取,不過不能準确擷取參數

三、傳回參數

視圖函數不能直接傳回

list

參數,是以改造一下

# -*- coding: utf-8 -*-

from flask import Flask, request, Request, jsonify


class MyRequest(Request):

    @property
    def json(self):
        """避免json資料未傳遞而傳回 None"""
        try:
            data = self.get_json()
        except Exception as e:
            data = None

        return data or {}

    @property
    def params(self):
        """
        将參數全都放入一個變量
        處理參數順序 args > form > json
        :return: {dict}
        """
        data = {}

        for key, value in self.args.items():
            data.setdefault(key, value)

        for key, value in self.form.items():
            data.setdefault(key, value)

        for key, value in self.json.items():
            data.setdefault(key, value)

        return data


class MyFlask(Flask):
    request_class = MyRequest

    def make_response(self, rv):
        """視圖函數可以直接傳回list 或者 dict"""
        if isinstance(rv, (list, dict)):
            return jsonify(rv)
        return super().make_response(rv)

    def post(self, rule, **options):
        """便于書寫post方法"""
        options.setdefault('methods', ['POST'])
        return self.route(rule, **options)


app = MyFlask(__name__)


@app.post("/")
def index():
    return ['cat', 'pig']


if __name__ == '__main__':
    app.run(debug=True)      

額外添加了

post

方法,便于書寫post請求

相關文章
  1. Flask最佳實踐-1
  2. Flask最佳實踐-2