Flask 中很重要的 request 对象

  • 浏览器访问服务端时,向服务端发送请求
  • Flask 程序使用 request 对象描述请求信息
  • 当你想获取请求体、请求参数、请求头数据的时候,就需要靠 request 对象了
  • 这一篇会用结果驱动源码解析的方式来讲解

真实使用场景

浏览器访问服务端,需要将相应的数据发送给服务端,可能有如下场景:

  1. 通过 URL 参数进行查询,浏览器需要将查询参数发送给服务端
  2. 提交表单 form 进行查询,浏览器需要将表单 form 中的字段发送给服务端
  3. 上传文件,浏览器需要将文件发送给服务端
  4. 通过 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 请求参数的栗子

代码

  1. #!usr/bin/env python
  2. # -*- coding:utf-8 _*-
  3. """
  4. # author: 小菠萝测试笔记
  5. # blog: https://www.cnblogs.com/poloyy/
  6. # time: 2021/7/11 11:13 上午
  7. # file: 5_request.py
  8. """
  9.  
  10. from flask import Flask, request
  11.  
  12. app = Flask(__name__)
  13.  
  14. @app.route('/query')
  15. def query():
  16. return {"name": request.args['name'], "age": request.args['age']}
  17.  
  18. @app.route('/query2')
  19. def query2():
  20. print('args =', request.args)
  21. print('form =', request.form)
  22. return "form"
  23.  
  24. @app.route('/query3')
  25. def query3():
  26. print('args =', request.args)
  27. print('json =', request.json)
  28. return "json"
  29.  
  30. @app.route('/query4')
  31. def query4():
  32. return {"name": request.values['name'], "age": request.values['age']}
  33.  
  34. if __name__ == '__main__':
  35. app.run(debug=True)
  • 下面我会用 postman 统一通过 params,就是 url 请求参数传数据
  • 在 Flask 里面,把四种获取请求数据的属性都写一遍,然后看看最后的结果,提前帮大家踩坑

postman 发起请求的结果

/query

/query2

控制台输出

  1. args = ImmutableMultiDict([('name', 'zhangsan'), ('age', '13')])
  2. form = ImmutableMultiDict([])

用 form 属性的话得到是一个空字典哦

/query3

控制台输出

  1. args = ImmutableMultiDict([('name', 'zhangsan'), ('age', '13')])
  2. json = None 

用 json 属性的话得到是一个 None 哦,所以无论如何都不要用 json 获取 url 请求参数哟!

/query4

可以看到 values 属性也能拿到 url 请求参数哦

获取表单参数的栗子

代码

  1. #!usr/bin/env python
  2. # -*- coding:utf-8 _*-
  3. """
  4. # author: 小菠萝测试笔记
  5. # blog: https://www.cnblogs.com/poloyy/
  6. # time: 2021/7/11 1:47 下午
  7. # file: 5_request_form.py
  8. """
  9.  
  10. from flask import Flask, request
  11.  
  12. app = Flask(__name__)
  13.  
  14. @app.route('/addUser', methods=['POST'])
  15. def check_login():
  16. return {"name": request.form['name'], "age": request.form['age']}
  17.  
  18. @app.route('/addUser2', methods=['POST'])
  19. def check_login2():
  20. print('form =', request.form)
  21. print('args =', request.args)
  22. return "good"
  23.  
  24. @app.route('/addUser3', methods=['POST'])
  25. def check_login3():
  26. print('form =', request.form)
  27. print('json =', request.json)
  28. return "good"
  29.  
  30. @app.route('/addUser4', methods=['POST'])
  31. def check_login4():
  32. return {"name": request.values['name'], "age": request.values['age']}
  33.  
  34. if __name__ == '__main__':
  35. app.run(debug=True)
  • 下面我会用 postman 统一通过 form-data,就是表单格式来传数据
  • 在 Flask 里面,把四种获取请求数据的属性都写一遍,然后看看最后的结果,提前帮大家踩坑

postman 发起请求的结果

/addUser

/addUser2

控制台输出

  1. form = ImmutableMultiDict([('name', 'poloyy'), ('age', '12')])
  2. args = ImmutableMultiDict([])

用 args 属性的话得到是一个空字典哦

/addUser3

控制台输出

  1. form = ImmutableMultiDict([('name', 'poloyy'), ('age', '12')])
  2. json = None

用 json 属性的话得到是一个 None 哦,所以无论如何都不要用 json 获取 form-data 哟!

/addUser4

可以看到 values 属性也能拿到 form 表单提交的数据哦

获取 Json 数据的栗子

代码

  1. #!usr/bin/env python
  2. # -*- coding:utf-8 _*-
  3. """
  4. # author: 小菠萝测试笔记
  5. # blog: https://www.cnblogs.com/poloyy/
  6. # time: 2021/7/11 1:47 下午
  7. # file: 5_request_form.py
  8. """
  9.  
  10. from flask import Flask, request
  11.  
  12. app = Flask(__name__)
  13.  
  14. @app.route('/addJson', methods=['POST'])
  15. def check_login():
  16. return {"name": request.json['name'], "age": request.json['age']}
  17.  
  18. @app.route('/addJson2', methods=['POST'])
  19. def check_login2():
  20. print('json =', request.json)
  21. print('args =', request.args)
  22. return "good"
  23.  
  24. @app.route('/addJson3', methods=['POST'])
  25. def check_login3():
  26. print('json =', request.json)
  27. print('form =', request.form)
  28. return "good"
  29.  
  30. @app.route('/addJson4', methods=['POST'])
  31. def check_login4():
  32. print('json =', request.json, type(request.json))
  33. print('values =', request.values)
  34. return {"name": request.json['name'], "age": request.json['age']}
  1. if __name__ == '__main__': app.run(debug=True)
  • 下面我会用 postman 统一通过 raw-json,就是 Json 格式的请求体来传数据
  • 在 Flask 里面,把四种获取请求数据的属性都写一遍,然后看看最后的结果,提前帮大家踩坑

postman 发起请求的结果

/addJson

/addJson2

  1. json = {'age': '12', 'name': 'poloyy'}
  2. args = ImmutableMultiDict([])

用 args 属性的话得到是一个空字典哦

/addJson3

  1. json = {'age': '12', 'name': 'poloyy'}
  2. form = ImmutableMultiDict([])

用 form 属性的话得到是一个空字典哦

/addJson4

这里要注意的是,当你的请求体是 Json 时,是不能通过 values 来获取请求数据哦!!

最后来看看 request.json 会返回什么吧

  1. json = {'age': '12', 'name': 'poloyy'} <class 'dict'>

request.json 拿到的就是 Json 格式的请求体,并且自动转换成字典了哦!

为什么 requests.values 能获取 form、args 的数据,但是拿不到 json 的数据呢?

request.values 源码

  • 能看到,它本质就是获取 args、form 的数据,但不包含 json 数据
  • 但是这里有个重点,只有你的请求方法不为 GET 的时候,发送 form 表单数据才能通过 request.values 拿到请求数据
  • 来试试是不是真的这样

代码

  1. @app.route('/query4', methods=["GET", "POST"])
  2. def query4():
  3. print(request.form)
  4. print(request.args)
  5. print(request.values)
  6. return {"name": request.values['name'], "age": request.values['age']}

postman 发起 GET 请求,form-data 传数据

直接报错,找不到对应的 name key,因为 request.values 是空的

控制台输出

  1. ImmutableMultiDict([('name', 'poloyy'), ('age', '12')])
  2. CombinedMultiDict([ImmutableMultiDict([])])
  3. ImmutableMultiDict([])

很明显,request.form 是能拿到数据的,但是 request.value 是拿不到数据哦

postman 发起 POST 请求,form-data 传数据

这次就能正常显示返回值啦

控制台输出

  1. ImmutableMultiDict([('name', 'poloyy'), ('age', '12')])
  2. ImmutableMultiDict([])
  3. CombinedMultiDict([ImmutableMultiDict([]), ImmutableMultiDict([('name', 'poloyy'), ('age', '12')])])

看源码应该知道,当非 GET 请求的时候传递表单数据,request.values 也能获取得到 request.form 的数据

Flask(7)- request 对象的更多相关文章

  1. 通过flask的request对象获取url

    测试了一下:通过发送 GET 到 http://127.0.0.1:5000/test/a?x=1, 后台输出为(官网说明): 1 request.path: /test/a 2 request.ho ...

  2. flask中request对象获取参数的方法

    从当前request获取内容: method: 起始行,元数据 host: 起始行,元数据 path: 起始行,元数据 environ: 其中的 SERVER_PROTOCOL 是起始行,元数据 he ...

  3. Flask的请求对象--request

    request-Flask的请求对象 请求解析和响应封装大部分是有Werkzeug完成的,Flask子类化Werkzeug的请求(Request)对象和响应(Response)对象,并添加了和程序的特 ...

  4. flask的请求上下文request对象

    Flask从客户端收到请求时,要让视图函数能访问请求对象request ,才能处理请求.我们可以将request对象作为参数传到试图函数里,比如: from flask import Flask, r ...

  5. Flask框架 之request对象

    一.request对象属性 属性 说明 类型 data 记录请求的数据,并转换为字符串 * form 记录请求中的表单数据 MultiDict args 记录请求中的查询参数 MultiDict co ...

  6. Flask中request参数

    首先要明确一件事,Request这是个对象,不管使用PHP还是python还是什么java语言,虽然request这个对象可能叫的名字不一样,(在其他语言中可能叫什么HttpRequest),但是原理 ...

  7. 【Flask】关于Flask的request属性

    前言 在进行Flask开发中,前端需要发送不同的请求及各种带参数的方式,比如GET方法在URL后面带参数和POST在BODY带参数,有时候又是POST的表单提交方式,这个时候就需要从request提取 ...

  8. Flask的request和session是从哪里来的?

    因为之前一直在项目中使用django, 所以在学习Flask的过程中, 难免对吧django和Flask进行对比, 这一次我发现Flask中的request和session并没有想象的那么简单, 所以 ...

  9. Flask入门request session cookie(二)

    1 HTTP方法分类 1 GET 浏览器告知服务器:只获取页面上的信息并发给我.这是最常用的方法. 2 HEAD 浏览器告诉服务器:欲获取信息,但是只关心消息头 .应用应像处理 GET 请求一样来处理 ...

随机推荐

  1. SSH 远程控制

    本文以 Ubuntu 20.04(客户端) 控制 Kali Linux 2020.2(服务端)为例 1.安装SSH(secure Shell) SSH分为客户端oppenssh-client和服务端o ...

  2. Linux服务之nginx服务篇一(概念)

    nginx官网:http://nginx.org/ 一. nginx和apache的区别 Nginx: 1.轻量级,采用 C 进行编写,同样的 web 服务,会占用更少的内存及资源. 2.抗并发,ng ...

  3. flink反压的监控

    反压在流式系统中是一种非常重要的机制,主要作用是当系统中下游算子的处理速度下降,导致数据处理速率低于数据接入的速率时,通过反向背压的方式让数据接入的速率下降,从而避免大量数据积压在flink系统中,最 ...

  4. 调试备忘录-SWD协议解析

    目录--点击可快速直达 目录 写在前面 1  SWD协议简介 2  SWD物理层协议解析 2.1  SWD通信时序分析 2.2  SWD 寄存器简介 2.2.1  DP寄存器 2.2.2  AP寄存器 ...

  5. ZooKeeper学习笔记一:集群搭建

    作者:Grey 原文地址:ZooKeeper学习笔记一:集群搭建 说明 单机版的zk安装和运行参考:https://zookeeper.apache.org/doc/r3.6.3/zookeeperS ...

  6. kafka之二:手把手教你安装kafka2.8.0(绝对实用)

    前面分享了kafka的基本知识,下面就要对kafka进行实操,先看如何安装. kafka需要zookepper的支持,所以要安装kafka需要有zookeeper的环境,zookeeper安装请参见& ...

  7. onnx算子大全

    本文通过此脚本从def文件自动生成.不要直接修改,而是编辑算子定义. 对于算子输入/输出的可辩别的,它可以是可辩别的.不可辩别的或未定义的.如果未指定变量的可辩别的,则该变量具有未定义的可辩别的. a ...

  8. h265player开发

    h265player开发 https://github.com/goldvideo/h265player 简介 随着视频编码技术的发展,相比H.264, H.265同等画质体积仅为一半.带宽占用省一半 ...

  9. JVM 垃圾回收算法和垃圾回收器

    JVM 垃圾回收算法和垃圾回收器. 一.垃圾回收的区域 栈:栈中的生命周期是跟随线程,所以一般不需要关注. 堆:堆中的对象是垃圾回收的重点. 方法区:这一块也会发生垃圾回收,不过这块的效率比较低,一般 ...

  10. LeetCode:322. 零钱兑换

    链接:https://leetcode-cn.com/problems/coin-change/ 标签:动态规划.完全背包问题.广度优先搜索 题目 给定不同面额的硬币 coins 和一个总金额 amo ...