一、參數傳遞
測試代碼
# -*- 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請求
相關文章