Flask request请求对象

简介: Flask request请求对象

引言

客户端发送 http 请求给 Flask程序,都会携带一些对应的请求信息,该如何获取呢?
from flask import request

request ,就是 Flask 中表示当前请求的对象,request 对象中保存了一次 http 请求的所有数据,并进行了封装处理,我们就可以用这个 request 请求对象来获取请求信息。

<br/>

request常用属性

属性 说明
data 记录请求的数据,如 json、xml
form 记录请求中的表单数据
args 记录请求中的查询参数
cookies 记录请求中的 cookie 信息
headers 记录请求中的报文头
method 记录请求中的请求方式
url 记录请求的 URL 地址
files 记录请求上传的文件

<br/>

接下来就挨个用一下。

"""
Author: hui
Desc: { Flask request请求对象的使用 }
"""
from flask import Flask, request

app = Flask(__name__)


@app.route('/')
def hello_world():
    print('request.data', request.data)
    print('request.url', request.url)
    print('request.method', request.method)
    print('request.headers\n', request.headers)
    print('request.form', request.form)
    print('request.args', request.args)
    print('request.cookies', request.cookies)
    print('request.files', request.files)
    return 'Hello World!'

<br/>

访问 http://127.0.0.1:5000/ 后PyCharm终端显示的结果如下

127.0.0.1 - - [26/Apr/2021 20:21:03] "GET / HTTP/1.1" 200 -
request.data b''

request.url http://127.0.0.1:5000/
        
request.method GET

request.headers
Host: 127.0.0.1:5000
    Connection: keep-alive
    Sec-Ch-Ua: " Not A;Brand";v="99", "Chromium";v="90", "Microsoft Edge";v="90"
    Sec-Ch-Ua-Mobile: ?0
    Upgrade-Insecure-Requests: 1
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36 Edg/90.0.818.42
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
    Sec-Fetch-Site: none
    Sec-Fetch-Mode: navigate
    Sec-Fetch-User: ?1
    Sec-Fetch-Dest: document
    Accept-Encoding: gzip, deflate, br
    Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
    Cookie: csrftoken=XjZW5a3obvzYxm5dqYtdsWRS5GzVP4tHMJTNquEVJVdWknIJXwRMaTJKYfOTCojh; Hm_lvt_b64a44bf14fabebd68d595c81302642d=1618121686,1618130897,1618133833,1618134629


request.form ImmutableMultiDict([])
request.args ImmutableMultiDict([])
request.cookies ImmutableMultiDict([('csrftoken', 'XjZW5a3obvzYxm5dqYtdsWRS5GzVP4tHMJTNquEVJVdWknIJXwRMaTJKYfOTCojh'), ('Hm_lvt_b64a44bf14fabebd68d595c81302642d', '1618121686,1618130897,1618133833,1618134629')])
request.files ImmutableMultiDict([])

<br/>

获取表单参数

首先要构建表单数据中,可以自己写一个网页,也可以用 PostMan 工具,这里是用 PostMan 来测试

PostMan 工具官网下载 https://www.postman.com/downloads/

PostMan 工具使用教程可以参考文章 Postman使用详解

<br/>

PostMan构建请求及数据

PostMan发送表单数据

<br/>

编写视图函数

from flask import Flask, request

app = Flask(__name__)

# 获取表单参数数据
@app.route('/index', methods=['GET', 'POST'])
def form_data():

    name = request.form.get('name')
    age = request.form.get('age')

    # 获取图片数据
    pic = request.files.get('pic')
    pic.save('./pic.png')

    name_li = request.form.getlist('name')
    res = 'name={}, age={}'.format(name_li, age)

    print('index')
    print(f'name={name}', f'age={age}')
    print(f'name_list={name_li}')
    return res

<br/>

PyCharm 终端展示详情

PyCharm展示结果

form 是用来提取请求体数据

通过 request.form 可以直接提取请求体中的表单格式的数据,是一个像字典的对象

通过 get 方法只能拿到多个同名参数的第一个, getList 才可以获取全部。

表单文件类型数据,直接使用 request.files.get 来获取,保存文件调用 save() 方法即可。

<br/>

获取查询字符串参数

编写视图函数

from flask import Flask, request

app = Flask(__name__)

# 获取查询字符串的参数数据
# http://127.0.0.1:5000/args?name=hui&age=21
@app.route('/args', methods=['GET', 'POST'])
def args_data():
    name = request.args.get('name')
    age = request.args.get('age')
    res = f'name={name}, age={age}'
    print(res)
    return f'<h1> {res} </h1>'

<br/>

查询字符串参数获取

PyCharm 终端显示的信息

name=hui, age=21
127.0.0.1 - - [26/Apr/2021 21:33:55] "GET /args?name=hui&age=21 HTTP/1.1" 200 -

<br/>

获取其他格式数据

获取前端发送过来的 json、xml 等数据

<br/>

编写视图函数

from flask import Flask, request

app = Flask(__name__)

# 获取不是表单格式的数据,如 json、xml等
@app.route('/info', methods=['GET', 'POST'])
def raw_data():
    # 如果请求体数据不是表单格式的(如json格式),可以通过request.data获取
    res = request.data
    return res

<br/>

PostMan构造请求查看
PostMan发送Json数据
<br/>
PostMan发送xml数据

<br/>

request对象知识扩展

我们在每一个视图函数中都使用这同一个 request 请求对象,像当全局变量一样使用。事实上,request 不可能是全局变量。试想,在多线程服务器中,多个线程同时处理不同客户端发送的不同请求时,每个线程看到的 request 对象必然不同。

Django 中则是让每个请求让视图函数以参数的形式进行保存,以致区分不同请求,而 Flask 则是通过使用上下文让特定的变量在一个线程中全局可访问,与此同时却不会干扰其他线程。

可以了解一下 线程局部变量 Thread Local 概念,大致实现方式

ThreadLocal{
    "线程A": {
        args: {'name': 'hui', 'age': 21},
        data: "{"name": "hui", "age": "21"}",    # 假设json字符串
        form: {'name': 'hui', 'age': 21}
        ...其他数据
    },
    
    "线程B": {
        args: {'name': 'jack', 'age': 22},
        data: "{"name": "jack", "age": "22"}",
        form: {'name': 'jack', 'age': 22}
        ...其他数据
    },
    
    ......其他线程
}

request = ThreadLocal.get("线程名")

Flask先在视图函数中有请求上下文环境,它会根据运行在哪一个线程,去取相对应线程的请求数据。

线程局部变量

<br/>

源代码

源代码已上传到 Gitee HuiDBK/FlaskBasic - 码云 - 开源中国 (gitee.com),欢迎大家来访。

✍ 码字不易,还望各位大侠多多支持:heart:。

<br/>

公众号

新建文件夹X

大自然用数百亿年创造出我们现实世界,而程序员用几百年创造出一个完全不同的虚拟世界。我们用键盘敲出一砖一瓦,用大脑构建一切。人们把1000视为权威,我们反其道行之,捍卫1024的地位。我们不是键盘侠,我们只是平凡世界中不凡的缔造者 。
相关文章
|
7月前
|
JSON 前端开发 数据安全/隐私保护
通过一个form表单的渲染演示,Flask的request,重定向语法
通过一个form表单的渲染演示,Flask的request,重定向语法
55 0
通过一个form表单的渲染演示,Flask的request,重定向语法
|
2月前
|
JSON 中间件 数据格式
五、Flask的请求和响应方法与常用技巧
五、Flask的请求和响应方法与常用技巧
94 0
|
7月前
|
前端开发 数据库 Python
使用 Python 的 Web 框架(如 Django 或 Flask)来建立后端接口,用于处理用户的请求,从数据库中查找答案并返回给前端界面
【1月更文挑战第13天】使用 Python 的 Web 框架(如 Django 或 Flask)来建立后端接口,用于处理用户的请求,从数据库中查找答案并返回给前端界面
249 7
|
6月前
|
JSON API 数据格式
如何使用Flask request对象处理请求
在 Flask 中,request对象是处理 HTTP 请求的重要工具之一。它提供了许多属性和方法,可以帮助我们获取请求的相关信息和数据。本文将向你介绍request对象的常用方法以及如何在 Flask 应用程序中使用它。
127 3
|
7月前
|
网络架构 Python
在Flask中,如何定义路由并处理HTTP请求的不同方法(GET、POST等)?
【4月更文挑战第25天】在Flask中,使用`@app.route()`装饰器定义路由,如`/hello`,处理GET请求返回&#39;Hello, World!&#39;。通过添加`methods`参数,可处理不同HTTP方法,如POST请求。单一函数可处理多种方法,通过检查`request.method`区分。动态路由使用 `&lt;variable_name&gt;` 传递URL变量到视图函数。这些基础构成处理HTTP请求的Flask应用。
111 1
|
7月前
|
JSON 数据格式 Python
如何在Flask框架中定义路由和处理请求?
【4月更文挑战第18天】在Flask框架中,创建应用实例、定义路由和处理请求涉及5个步骤:1) 导入Flask并实例化应用;2) 使用`app.route()`装饰器定义路由,指定URL和HTTP方法;3) 编写视图函数处理请求逻辑;4) 视图函数返回响应内容,Flask会自动转换格式;5) 用`app.run()`启动服务器。
97 3
|
7月前
|
存储 JSON 数据安全/隐私保护
Flask Python:如何获取不同请求方式的参数
Flask Python:如何获取不同请求方式的参数
344 0
|
7月前
|
网络协议 测试技术 Python
PythonWeb开发基础(三)类Flask框架请求封装
类Flask框架请求封装 Web服务器 本质是个TCP服务器,监听在特定端口上 支持HTTP协议,能够将HTTP请求报文进行解析,能够把响应数据进行HTTP协议的报文封装并返回浏览器端。
88 0
|
JSON 数据格式 Python
flask 接收get请求, 以及返回 json格式
flask 接收get请求, 以及返回 json格式
113 0
|
程序员 数据库连接 Python
Flask 请求钩子
Flask 请求钩子