Flask request请求对象

本文详细介绍了如何在Flask应用中使用request对象获取HTTP请求的各种信息,包括data、form、args、cookies、headers、method、url和files等属性。通过实例展示了获取表单参数、查询字符串参数和其他格式数据的方法,并探讨了request对象在多线程环境中的工作原理。
摘要由CSDN通过智能技术生成

引言

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

from flask import request

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


request常用属性

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

接下来就挨个用一下。

"""
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!'


访问 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([])


获取表单参数

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

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

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


PostMan构建请求及数据

PostMan发送表单数据


编写视图函数

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

PyCharm 终端展示详情

PyCharm展示结果

form 是用来提取请求体数据

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

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

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

获取查询字符串参数

编写视图函数

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>'

查询字符串参数获取

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 -

获取其他格式数据

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


编写视图函数

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

PostMan构造请求查看
PostMan发送Json数据


PostMan发送xml数据


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先在视图函数中有请求上下文环境,它会根据运行在哪一个线程,去取相对应线程的请求数据。

线程局部变量


源代码

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

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


公众号

新建文件夹X

大自然用数百亿年创造出我们现实世界,而程序员用几百年创造出一个完全不同的虚拟世界。我们用键盘敲出一砖一瓦,用大脑构建一切。人们把1000视为权威,我们反其道行之,捍卫1024的地位。我们不是键盘侠,我们只是平凡世界中不凡的缔造者 。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值