Flask(7)- request 对象
Flask 中很重要的 request 对象
- 浏览器访问服务端时,向服务端发送请求
- Flask 程序使用 request 对象描述请求信息
- 当你想获取请求体、请求参数、请求头数据的时候,就需要靠 request 对象了
- 这一篇会用结果驱动源码解析的方式来讲解
真实使用场景
浏览器访问服务端,需要将相应的数据发送给服务端,可能有如下场景:
- 通过 URL 参数进行查询,浏览器需要将查询参数发送给服务端
- 提交表单 form 进行查询,浏览器需要将表单 form 中的字段发送给服务端
- 上传文件,浏览器需要将文件发送给服务端
- 通过 JSON 格式的请求体进行请求,一般是 post 请求
服务端收到将客户端发送的数据后,封装形成一个请求对象,在 Flask 中,请求对象是一个模块变量 flask.request
request 包含的常用属性
| 属性 | 说明 |
|---|---|
| method | 当前的请求方法 |
| form | 表单参数及其值的字典对象 |
| args | 查询字符串的字典对象 |
| values | 包含所有数据的字典对象 |
| json | 如果 mimetype 是 application/json,这个参数将会解析 json 数据,如果不是则返回 None |
| headers | http 协议 请求头 |
| cookies | cookie 名称和值的字典对象 |
| files | 与上传文件有关的数据 |
form、args、values、json 都是获取 http 请求的请求数据的属性,只不过请求体类型不同
还记得之前讲 url 组成的时候,request 对象也能获取 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 |
获取 url 请求参数的栗子
代码
#!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)
- 下面我会用 postman 统一通过 params,就是 url 请求参数传数据
- 在 Flask 里面,把四种获取请求数据的属性都写一遍,然后看看最后的结果,提前帮大家踩坑
postman 发起请求的结果
/query

/query2
控制台输出
args = ImmutableMultiDict([('name', 'zhangsan'), ('age', '13')])
form = ImmutableMultiDict([])
用 form 属性的话得到是一个空字典哦
/query3
控制台输出
args = ImmutableMultiDict([('name', 'zhangsan'), ('age', '13')])
json = None
用 json 属性的话得到是一个 None 哦,所以无论如何都不要用 json 获取 url 请求参数哟!
/query4

可以看到 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)
- 下面我会用 postman 统一通过 form-data,就是表单格式来传数据
- 在 Flask 里面,把四种获取请求数据的属性都写一遍,然后看看最后的结果,提前帮大家踩坑
postman 发起请求的结果
/addUser

/addUser2
控制台输出
form = ImmutableMultiDict([('name', 'poloyy'), ('age', '12')])
args = ImmutableMultiDict([])
用 args 属性的话得到是一个空字典哦
/addUser3
控制台输出
form = ImmutableMultiDict([('name', 'poloyy'), ('age', '12')])
json = None
用 json 属性的话得到是一个 None 哦,所以无论如何都不要用 json 获取 form-data 哟!
/addUser4

可以看到 values 属性也能拿到 form 表单提交的数据哦
获取 Json 数据的栗子
代码
#!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']}
if __name__ == '__main__': app.run(debug=True)
- 下面我会用 postman 统一通过 raw-json,就是 Json 格式的请求体来传数据
- 在 Flask 里面,把四种获取请求数据的属性都写一遍,然后看看最后的结果,提前帮大家踩坑
postman 发起请求的结果
/addJson

/addJson2
json = {'age': '12', 'name': 'poloyy'}
args = ImmutableMultiDict([])
用 args 属性的话得到是一个空字典哦
/addJson3
json = {'age': '12', 'name': 'poloyy'}
form = ImmutableMultiDict([])
用 form 属性的话得到是一个空字典哦
/addJson4

这里要注意的是,当你的请求体是 Json 时,是不能通过 values 来获取请求数据哦!!
最后来看看 request.json 会返回什么吧
json = {'age': '12', 'name': 'poloyy'} <class 'dict'>
request.json 拿到的就是 Json 格式的请求体,并且自动转换成字典了哦!
为什么 requests.values 能获取 form、args 的数据,但是拿不到 json 的数据呢?
request.values 源码

- 能看到,它本质就是获取 args、form 的数据,但不包含 json 数据
- 但是这里有个重点,只有你的请求方法不为 GET 的时候,发送 form 表单数据才能通过 request.values 拿到请求数据
- 来试试是不是真的这样
代码
@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']}
postman 发起 GET 请求,form-data 传数据

直接报错,找不到对应的 name key,因为 request.values 是空的
控制台输出
ImmutableMultiDict([('name', 'poloyy'), ('age', '12')])
CombinedMultiDict([ImmutableMultiDict([])])
ImmutableMultiDict([])
很明显,request.form 是能拿到数据的,但是 request.value 是拿不到数据哦
postman 发起 POST 请求,form-data 传数据

这次就能正常显示返回值啦
控制台输出
ImmutableMultiDict([('name', 'poloyy'), ('age', '12')])
ImmutableMultiDict([])
CombinedMultiDict([ImmutableMultiDict([]), ImmutableMultiDict([('name', 'poloyy'), ('age', '12')])])
看源码应该知道,当非 GET 请求的时候传递表单数据,request.values 也能获取得到 request.form 的数据
Flask(7)- request 对象的更多相关文章
- 通过flask的request对象获取url
测试了一下:通过发送 GET 到 http://127.0.0.1:5000/test/a?x=1, 后台输出为(官网说明): 1 request.path: /test/a 2 request.ho ...
- flask中request对象获取参数的方法
从当前request获取内容: method: 起始行,元数据 host: 起始行,元数据 path: 起始行,元数据 environ: 其中的 SERVER_PROTOCOL 是起始行,元数据 he ...
- Flask的请求对象--request
request-Flask的请求对象 请求解析和响应封装大部分是有Werkzeug完成的,Flask子类化Werkzeug的请求(Request)对象和响应(Response)对象,并添加了和程序的特 ...
- flask的请求上下文request对象
Flask从客户端收到请求时,要让视图函数能访问请求对象request ,才能处理请求.我们可以将request对象作为参数传到试图函数里,比如: from flask import Flask, r ...
- Flask框架 之request对象
一.request对象属性 属性 说明 类型 data 记录请求的数据,并转换为字符串 * form 记录请求中的表单数据 MultiDict args 记录请求中的查询参数 MultiDict co ...
- Flask中request参数
首先要明确一件事,Request这是个对象,不管使用PHP还是python还是什么java语言,虽然request这个对象可能叫的名字不一样,(在其他语言中可能叫什么HttpRequest),但是原理 ...
- 【Flask】关于Flask的request属性
前言 在进行Flask开发中,前端需要发送不同的请求及各种带参数的方式,比如GET方法在URL后面带参数和POST在BODY带参数,有时候又是POST的表单提交方式,这个时候就需要从request提取 ...
- Flask的request和session是从哪里来的?
因为之前一直在项目中使用django, 所以在学习Flask的过程中, 难免对吧django和Flask进行对比, 这一次我发现Flask中的request和session并没有想象的那么简单, 所以 ...
- Flask入门request session cookie(二)
1 HTTP方法分类 1 GET 浏览器告知服务器:只获取页面上的信息并发给我.这是最常用的方法. 2 HEAD 浏览器告诉服务器:欲获取信息,但是只关心消息头 .应用应像处理 GET 请求一样来处理 ...
随机推荐
- Linux创建RAID0_实战
Linux创建RAID实战 一.Linux创建RAID0 RAID0俗称条带,它将两个或多个硬盘组成一个逻辑硬盘,容量是所有硬盘之和 因为是多个硬盘组合成一个,故可并行写操作,写入速度提高,但此方式硬 ...
- 006.Ansible自定义变量
ansible支持变量,用于存储会在整个项目中重复使用到的一些值.以简化项目的创建与维护,降低出错的机率. 变量的定义: 变量名应该由字母.数字下划数组成 变量名必须以字母开头 ansible内置关键 ...
- k8s集群部署(2)
一.利用ansible部署kubernetes准备阶段 1.集群介绍 基于二进制方式部署k8s集群和利用ansible-playbook实现自动化:二进制方式部署有助于理解系统各组件的交互原理和熟悉组 ...
- bond4以及vlan子接口配置
场景: 前提,交换机的配置由网络工程师配合! 1.跨交换机做bond,模式为LACP,linux双网卡做bond4,模式为4: 2.系统为centos7.0-123: 3.服务器仅有两张万兆网卡,为e ...
- mysql左连接和分组实例
例: 需求:查询A表中的所有列,并查询A表中的数据(ID)在B表中出现的次数,然后按model排序,最后所有结果在一张表中展示 A表结构: B表结构: ini_device_policy表中id与in ...
- unity项目字符串转为Vector3和Quaternion
运用环境:一般在读取csv表格的数据时是string类型转为Vector3或者Quaternion类型 字符串格式:x,x,x /x,x,x,x (英文逗号) 方法: /// <summary& ...
- 「 洛谷 」P2151 [SDOI2009]HH去散步
小兔的话 欢迎大家在评论区留言哦~ HH去散步 题目限制 内存限制:125.00MB 时间限制:1.00s 标准输入 标准输出 题目知识点 动态规划 \(dp\) 矩阵 矩阵乘法 矩阵加速 矩阵快速幂 ...
- zookeeper之二:zookeeper3.7.0安装过程实操
前面分享了zookeeper的基本知识,下面分享有关zookeeper安装的知识. 1.下载 zookeeper的官网是:https://zookeeper.apache.org/ 在官网上找到下载链 ...
- synchronized使用及java中的原子性问题
1.Synchronized关键字使用 class X { // 修饰非静态方法 synchronized void foo() { // 临界区 } // 修饰静态方法 synchronized s ...
- 3D结构光
3D结构光 3D结构光的整个系统包含结构光投影设备.摄像机.图像采集和处理系统.其过程就是投影设备发射光线到被测物体上,摄像机拍摄在被测物体上形成的三维光图形,拍摄图像经采集处理系统处理后获得被测物体 ...