浏览器访问服务端,需要将相应的数据发送给服务端,可能有如下场景:
服务端收到将客户端发送的数据后,封装形成一个请求对象,在 Flask 中,请求对象是一个模块变量 flask.request
属性 | 说明 |
---|---|
method | 当前的请求方法 |
form | 表单参数及其值的字典对象 |
args | 查询字符串的字典对象 |
values | 包含所有数据的字典对象 |
json | 如果 mimetype 是 application/json,这个参数将会解析 json 数据,如果不是则返回 None |
headers | http 协议 请求头 |
cookies | cookie 名称和值的字典对象 |
files | 与上传文件有关的数据 |
form、args、values、json 都是获取 http 请求的请求数据的属性,只不过请求体类型不同
还记得之前讲 url 组成的时候,request 对象也能获取 url 相关参数吗,复习下
假设 URL 等于 http://localhost/query?userId=123,request 对象中与 URL 参数相关的属性如下
属性 | 说明 |
---|---|
url | http://localhost/query?userId=123 |
base_url | http://localhost/query |
host | localhost |
host_url | http://localhost/ |
path | /query |
full_path | /query?userId=123 |
#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
# author: 小菠萝测试笔记
# blog: https://www.cnblogs.com/poloyy/
# time: 2021/7/11 11:13 上午
# file: 5_request.py
"""
from flask import Flask, request
app = Flask(__name__)
@app.route('/query')
def query():
return {"name": request.args['name'], "age": request.args['age']}
@app.route('/query2')
def query2():
print('args =', request.args)
print('form =', request.form)
return "form"
@app.route('/query3')
def query3():
print('args =', request.args)
print('json =', request.json)
return "json"
@app.route('/query4')
def query4():
return {"name": request.values['name'], "age": request.values['age']}
if __name__ == '__main__':
app.run(debug=True)
控制台输出
args = ImmutableMultiDict([('name', 'zhangsan'), ('age', '13')])
form = ImmutableMultiDict([])
用 form 属性的话得到是一个空字典哦
控制台输出
args = ImmutableMultiDict([('name', 'zhangsan'), ('age', '13')])
json = None
用 json 属性的话得到是一个 None 哦,所以无论如何都不要用 json 获取 url 请求参数哟!
可以看到 values 属性也能拿到 url 请求参数哦
#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
# author: 小菠萝测试笔记
# blog: https://www.cnblogs.com/poloyy/
# time: 2021/7/11 1:47 下午
# file: 5_request_form.py
"""
from flask import Flask, request
app = Flask(__name__)
@app.route('/addUser', methods=['POST'])
def check_login():
return {"name": request.form['name'], "age": request.form['age']}
@app.route('/addUser2', methods=['POST'])
def check_login2():
print('form =', request.form)
print('args =', request.args)
return "good"
@app.route('/addUser3', methods=['POST'])
def check_login3():
print('form =', request.form)
print('json =', request.json)
return "good"
@app.route('/addUser4', methods=['POST'])
def check_login4():
return {"name": request.values['name'], "age": request.values['age']}
if __name__ == '__main__':
app.run(debug=True)
控制台输出
form = ImmutableMultiDict([('name', 'poloyy'), ('age', '12')])
args = ImmutableMultiDict([])
用 args 属性的话得到是一个空字典哦
控制台输出
form = ImmutableMultiDict([('name', 'poloyy'), ('age', '12')])
json = None
用 json 属性的话得到是一个 None 哦,所以无论如何都不要用 json 获取 form-data 哟!
可以看到 values 属性也能拿到 form 表单提交的数据哦
#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
# author: 小菠萝测试笔记
# blog: https://www.cnblogs.com/poloyy/
# time: 2021/7/11 1:47 下午
# file: 5_request_form.py
"""
from flask import Flask, request
app = Flask(__name__)
@app.route('/addJson', methods=['POST'])
def check_login():
return {"name": request.json['name'], "age": request.json['age']}
@app.route('/addJson2', methods=['POST'])
def check_login2():
print('json =', request.json)
print('args =', request.args)
return "good"
@app.route('/addJson3', methods=['POST'])
def check_login3():
print('json =', request.json)
print('form =', request.form)
return "good"
@app.route('/addJson4', methods=['POST'])
def check_login4():
print('json =', request.json, type(request.json))
print('values =', request.values)
return {"name": request.json['name'], "age": request.json['age']}
json = {'age': '12', 'name': 'poloyy'}
args = ImmutableMultiDict([])
用 args 属性的话得到是一个空字典哦
json = {'age': '12', 'name': 'poloyy'}
form = ImmutableMultiDict([])
用 form 属性的话得到是一个空字典哦
这里要注意的是,当你的请求体是 Json 时,是不能通过 values 来获取请求数据哦!!
最后来看看 request.json 会返回什么吧
json = {'age': '12', 'name': 'poloyy'} <class 'dict'>
request.json 拿到的就是 Json 格式的请求体,并且自动转换成字典了哦!
@app.route('/query4', methods=["GET", "POST"])
def query4():
print(request.form)
print(request.args)
print(request.values)
return {"name": request.values['name'], "age": request.values['age']}
直接报错,找不到对应的 name key,因为 request.values 是空的
ImmutableMultiDict([('name', 'poloyy'), ('age', '12')])
CombinedMultiDict([ImmutableMultiDict([])])
ImmutableMultiDict([])
很明显,request.form 是能拿到数据的,但是 request.value 是拿不到数据哦
这次就能正常显示返回值啦
ImmutableMultiDict([('name', 'poloyy'), ('age', '12')])
ImmutableMultiDict([])
CombinedMultiDict([ImmutableMultiDict([]), ImmutableMultiDict([('name', 'poloyy'), ('age', '12')])])
看源码应该知道,当非 GET 请求的时候传递表单数据,request.values 也能获取得到 request.form 的数据