flask框架中request请求用法详解

article/2025/9/11 21:45:54

        当浏览器去访问一个地址时,Http协议会向后台传递一个request对象。这个request对象包含请求头、请求参数、以及请求方式,当然后台可以取到request。然后进行逻辑处理。

        在flask框架中,request对象是一个全局的,在任何地方都可以使用。

        request中包含了前端发送过来的所有数据 ,请求的 request 对象中保存了一次HTTP请求的一切信息。  

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

        通过get方法只能拿到多个重名参数的第一个。

reques常用的属性:

  • 如果是json格式的请求数据,则是采用request.data来获取请求体的字符串。
  • 如果是form表单的请求体,那么则可以使用request.form来获取参数。
  • 如果是url参数,例如:url?param1=xx&param2=xx,那么则可以使用request.args来获取参数。
  • 如果需要区分GET/POST请求方法,则可以使用request.method来进行判断区分。
  • 如果需要接收上传的文件,则可以使用request.files来获取上传的文件信息。

1、GET请求

        写个人信息的接口,也就是视图函数。新建一个名为personal_info.html的模板,在模板里写如下表单:

  • action:表示要提交到的地址
  • method:请求方式

personal_info.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<form action="/center/add" method="get">姓名:<input type="text" name="name"><br>年龄:<input type="text" name="age"><br>特长:篮球<input type="checkbox" name="hobby" value="篮球">足球<input type="checkbox" name="hobby" value="足球">排球<input type="checkbox" name="hobby" value="排球">羽毛球<input type="checkbox" name="hobby" value="羽毛球"><br><input type="submit" value="提交"></form>
</body>
</html>

        后台这个时候需要写两个视图,一个视图用于显示注册页面,一个视图用于处理前端传过来的参数:

from flask import Flask, request, render_templateapp = Flask(__name__)@app.route('/')
def index():return render_template('personal_info.html')@app.route('/center/add')
def center():if request.method == 'GET':  # 请求方式是getname = request.args.get('name')  # args取get方式参数age = request.args.get('age')hobby = request.args.getlist('hobby')  # getlist取一键多值类型的参数return "姓名:%s 年龄:%s 特长:%s" % (name, age, hobby)app.config['DEBUG'] = Trueif __name__ == '__main__':app.run(host='0.0.0.0', port=5000)

运行结果: 

 2、POST请求

        登录和注册都要使用Post请求,一些敏感信息不能在浏览器的地址上显示。把刚才的个人信息例子改成Post请求,前端只需要把表单里面的method改下就行:

method="post"

后端需要改两个地方:

  • 请求方法:默认是get请求
  • 参数提前:把args改成form
from flask import Flask, request, render_templateapp = Flask(__name__)@app.route('/')
def index():return render_template('personal_info.html')@app.route('/center/add', methods=['GET', 'POST'])  # 支持get和post方法
def center():if request.method == 'GET':  # 请求方式是getname = request.args.get('name')  # args取get方式参数age = request.args.get('age')hobby = request.args.getlist('hobby')  # getlist取一键多值类型的参数return "姓名:%s 年龄:%s 特长:%s" % (name, age, hobby)elif request.method == 'POST':name = request.form.get('name')  # form取post方式参数age = request.form.get('age')hobby = request.form.getlist('hobby')  # getlist取一键多值类型的参数return "姓名:%s 年龄:%s 特长:%s" % (name, age, hobby)app.config['DEBUG'] = Trueif __name__ == '__main__':app.run(host='0.0.0.0', port=5000)

运行结果:

3、GET和POST为同一URL

personal_info.html:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<form action="/personal_info" method="post">姓名:<input type="text" name="name"><br>年龄:<input type="text" name="age"><br>特长:篮球<input type="checkbox" name="hobby" value="篮球">足球<input type="checkbox" name="hobby" value="足球">排球<input type="checkbox" name="hobby" value="排球">羽毛球<input type="checkbox" name="hobby" value="羽毛球"><br><input type="submit" value="提交"></form>
</body>
</html>

main.py

from flask import Flask, request, render_templateapp = Flask(__name__)@app.route('/personal_info', methods=['GET', 'POST'])  # 支持get和post方法
def center():if request.method == 'GET':  # 请求方式是getreturn render_template('personal_info.html')elif request.method == 'POST':name = request.form.get('name')  # form取post方式参数age = request.form.get('age')hobby = request.form.getlist('hobby')  # getlist取一键多值类型的参数return "姓名:%s 年龄:%s 特长:%s" % (name, age, hobby)app.config['DEBUG'] = Trueif __name__ == '__main__':app.run(host='0.0.0.0', port=5000)

运行结果:

4、上传文件

        上传文件也是常用的功能,前端上传一张文件,然后后端处理保存到服务器上。文件这种类型属于多媒体类型资源。前端form表单里面需要加enctype="multipart/form-data"

upload.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Upload</title>
</head>
<body>
<form action="" method="post" enctype="multipart/form-data"><input type="file" name="file"><input type="submit" value="上传">
</form>
</body>
</html>

upload.py

from flask import Flask, request, render_template, redirect, url_for
from werkzeug.utils import secure_filename
import os
from flask import send_from_directoryapp = Flask(__name__)UPLOAD_FOLDER = 'media'  # 注意:要提前在根目录下新建media文件,否则会报错
ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'])
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER# 判断上传的文件是否是允许的后缀
def allowed_file(filename):return "." in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS@app.route("/upload", methods=['GET', 'POST'])
def upload():if request.method == 'GET':return render_template('upload.html')else:if "file" not in request.files:return redirect(request.url)file = request.files.get('file')  # 获取文件if file.filename == '':return redirect(request.url)if file and allowed_file(file.filename):filename = secure_filename(file.filename)  # 用这个函数确定文件名称是否是安全 (注意:中文不能识别)file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))  # 保存文件return redirect(url_for('show', filename=filename))# 展示图片
@app.route('/show/<filename>')
def show(filename):# send_from_directory可以从目录加载文件return send_from_directory(app.config['UPLOAD_FOLDER'], filename)if __name__ == '__main__':app.run(host='0.0.0.0', port=5000, debug=True)

运行结果:

 

5、获取客户端IP

        可以使用request.remote_add获取客户端IP。

        remote_addr代表客户端的IP,但它的值不是由客户端提供的,而是服务端根据客户端的ip指定的,当你的浏览器访问某个网站时,假设中间没有任何代理,那么网站的web服务器(Nginx,Apache等)就会把remote_addr设为你的机器IP,如果你用了某个代理,那么你的浏览器会先访问这个代理,然后再由这个代理转发到网站,这样web服务器就会把remote_addr设为这台代理机器的IP。

示例代码:

from flask import Flask, requestapp = Flask(__name__)@app.route('/')
def index():addr = request.remote_addrprint(addr)return "Hello World! My IP is :" + addrif __name__ == '__main__':app.run('0.0.0.0')

运行结果:

6、flask中request.args和request.form区别

  • 当get请求时,需要使用request.args来获取数据
  • 当post请求时,需要使用request.form来获取数据

7、request属性使用 

7.1 Json请求:使用request.data获取请求体

示例代码:

from flask import Flask, request
import jsonapp = Flask(__name__)@app.route('/json', methods=['POST'])
def json_request():data = json.loads(request.data)  # 将json字符串转为dictname = data['name']age = data['age']return F"name is {name}, age is {age}"if __name__ == '__main__':app.run()

7.2 form表单请求:request.form 获取请求参数

示例代码:

from flask import Flask, requestapp = Flask(__name__)@app.route('/form', methods=['POST'])
def form_request():name = request.form.get('name')age = request.form.get('age')return F"name is {name}, age is {age}"if __name__ == '__main__':app.run()

7.3 form 表单请求中存在同一个参数名多个值的情况

示例代码:

from flask import Flask, requestapp = Flask(__name__)@app.route('/form', methods=['POST'])
def form_request():name = request.form.get('name')age = request.form.get('age')name_list = request.form.getlist('name')return F"name is {name}, age is {age}, name_list is {name_list}"if __name__ == '__main__':app.run()

7.4 URL请求参数: request.args

示例代码:

from flask import Flask, requestapp = Flask(__name__)@app.route('/args', methods=['GET', 'POST'])
def args_request():name = request.args.get('name')age = request.args.get('age')name_list = request.args.getlist('name')return F"name is {name}, age is {age}, name_list is {name_list}"if __name__ == '__main__':app.run()

7.5 上传文件请求:request.files

示例代码:

from flask import Flask, requestapp = Flask(__name__)@app.route('/upload_file', methods=['POST'])
def file_request():file = request.files.get('file')if file is None:return "未上传文件!"file.save(f"{file.name}.jpg")return f"{file}文件上传成功!"if __name__ == '__main__':app.run()

7.6 request.args.to_dict()用法

示例代码:

from flask import Flask, requestapp = Flask(__name__)@app.route('/args', methods=['GET', 'POST'])
def args_request():data = request.args.to_dict()return dataif __name__ == '__main__':app.run()

7.7 request.get_json()用法

示例代码:

from flask import Flask, requestapp = Flask(__name__)@app.route('/args', methods=['GET', 'POST'])
def args_request():data = request.get_json()return dataif __name__ == '__main__':app.run()

7.8 request.json用法 

示例代码:

from flask import Flask, requestapp = Flask(__name__)@app.route('/process_json', methods=['POST'])
def process_json():json_data = request.json# 对接收到的JSON数据进行处理return json_dataif __name__ == '__main__':app.run()

运行结果:

7.9 request.json和request.get_json()用法区别

        在Flask框架中,request.json和request.get_json()都是用于获取请求体中的JSON数据的方法,但它们之间有一些区别。

        request.json是一个属性,用于从请求体中获取JSON数据。它只能在请求方法(如POST、PUT)中使用,并且只能使用一次。如果请求体中不包含JSON数据,则request.json将返回None。

        request.get_json()是一个方法,用于从请求体中获取JSON数据。它可以在任何请求方法中使用,并且可以使用多次。如果请求体中不包含JSON数据,则request.get_json()将返回None。此方法还可以接受一些参数,例如strict和silent,用于指定解析JSON数据时的严格程度和错误处理方式。

        综上所述,request.get_json()是更灵活和通用的方法,而request.json则更简单和直接。如果您确定请求体中包含JSON数据,并且您只需要一次使用它,则可以使用request.json。否则,建议使用request.get_json()。


http://chatgpt.dhexx.cn/article/xuf98Yn9.shtml

相关文章

Python-request库用法

一、HTTP详解 二、Request主要方法 1、基本方法简介 总共有七个方法&#xff0c;这七个方法最后都是使用requests.request()实现。 2、Request返回 r.encoding是从头部获取的内容编码方式&#xff08;r.text的编码&#xff09; r.apparent_encoding 是根据内容分析出来的&a…

Jmeter - JDBC Request使用方法

系统&#xff1a;windows11 jmeter版本&#xff1a;5.4.3 一、建立数据库连接 1、添加配置原件JDBC Connection Configuration&#xff1a;线程组 - 右键“添加” - 配置原件 - JDBC Connection Configuration 2、配置JDBC Connection Configuration JDBC Connection Configu…

request基本使用教程

request使用 一.基本用法 1.准备工作安装request库&#xff0c;pip安装或再pycharm内安装。 2.实例引入renquest库中方法清晰简单&#xff0c;获取网页直接使用get方法就能直接实现&#xff1a; 代码&#xff1a; import requests response requests.get(http://www.baidu.…

request方法

2019独角兽企业重金招聘Python工程师标准>>> 1request概述 request是Servlet.service()方法的一个参数&#xff0c;类型为javax.servlet.http.HttpServletRequest。在客户端发出每个请求时&#xff0c;服务器都会创建一个request对象&#xff0c;并把请求数据封装到…

【8086汇编】cmp指令和条件转移指令jxxx

1.定义 2.无符号比较影响标志位 3.有符号比较影响标志位 4.各种条件转移指令 5.cmp配合条件转移的使用

汇编cmp比较指令详解

刚刚看到了cmp指令&#xff0c;一开始有点晕。后来上网找了些资料&#xff0c;终于看明白了&#xff0c;为了方便初学者&#xff0c;我就简单写下我的思路吧。高手绕过&#xff0c;谢谢&#xff01; cmp(compare)指令进行比较两个操作数的大小 例:cmp oprd1,oprd2 为第一个操作…

汇编中的test和cmp指令

看过破解教程,都知道test,cmp是比较关键,来分析一下它们究竟是怎么比较 首先看看:状态寄存器(即标志寄存器) PSW(Program Flag)程序状态字(即标志)寄存器,是一个16位寄存器,由条件码标志(flag)和控制标志构成, 如下所示: 条件码&#xff1a; ①OF(Overflow Flag)溢出标志,溢出…

条件执行指令 CMP

CMP可以比较两个数的关系&#xff0c;其本质就是一条减法指令&#xff0c;只是不会将运算结果保存到寄存器&#xff0c;因为对于CPU而言&#xff0c;比较两个数时只关心结果是false还是true 指令格式&#xff1a;CMP <第一操作寄存器> <第二操作数> 第一操作寄…

嵌入式cmp指令的判断标志位_AB PLC | Logix5000控制器状态标志

前言:Logix5000控制器没有状态文件,要访问状态信息,需要使用状态标志。另外,这些标志状态可以根据需要,将其用于程序编写,实现一些特定的功能. 状态标志 1. 状态标志关键字有:S:FS、S:N、S:Z、S:V、S:C、S:MINOR. 2. 可通过指令直接访问这些状态标志,它们并非标签,不能…

嵌入式cmp指令的判断标志位_刘帅嵌入式系统-当前程序状态寄存器(cpsr)

CPSR的格式如下图。SPSR格式与CPSR格式相同。 1、条件标志位 N(Negative)、Z(Zero)、C(Carry)及V(oVerflow)统称为条件标志位。大部分的ARM指令可以根据CPSR中的这些条件标志位选择性地执行。各条件标志位的具体含义如下。 N:当两个补码表示的有符号整数运算时,N=1表示运算的…

嵌入式cmp指令的判断标志位_ARM汇编指令集

ARM处理器的指令集可以分为跳转指令、数据处理指令、程序状态寄存器(PSR)处理指令、加载/存储指令、协处理器指令和异常产生指令6大指令。 一、跳转指令 跳转指令用于实现程序流程的跳转,在ARM程序中有以下两种方法可以实现程序流程的跳转。Ⅰ.使用专门的跳转指令; Ⅱ.直接…

实操汇编原理cmp指令 对比sub与cmp指令

mov ax, 5 mov bx, 5 cmp ax, bx这段指令是5-50&#xff0c;但是并不是在寄存器中a改值: 还没有给ax寄存器放值之前如上图&#xff0c;放入ax和bx之后如下图: 这个时候再step调试一步也就是走cmp ax,bx之后变成如下: 这里可以看到ax并没有发生改变&#xff0c;改变的是flag…

CMP指令(cmp指令的功能)

目前有哪些类型的CMP&#xff1f; 目前有共享一级Cache的CMP、共享二级Cache的CMP以及共享主存的CMP PLC里的cmp比较指令是不是停电保持&#xff1f; OQ0.0 /或 Q0.0常开触点 这个是Q0.0线圈的常开触点&#xff0c;作用就是停电自保持 CMP指令的指令详解 原发布者:weilei1201 c…

汇编语言 CMP指令

CMP(比较)指令执行从目的操作数中减去源操作数的隐含减法操作&#xff0c;并且不修改任何操作数。 指令格式&#xff1a; CMP 目的操作数, 源操作数标志位 当实际的减法发生时&#xff0c;CMP指令按照计算结果修改溢出、符号、零、进位、辅助进位和奇偶标志位。如果比较的是两…

时钟周期、机器周期、总线周期、指令周期的关系

一、时钟周期 时钟周期由主频决定&#xff0c;是最小的时间单位 也叫节拍、T周期、cpu时钟周期 二、机器周期 cpu完成一项基本操作所需最短时间&#xff0c;用了多个时钟周期 又叫cpu周期 例&#xff1a;取指周期&#xff08;含取指令和分析指令&#xff09;、间址周期、执行…

请说明指令周期、机器周期、时钟周期之间的关系。

一条指令周期包括若干个机器周期&#xff0c;一条机器周期又包括若干个时钟周期&#xff0c;时钟周期即振荡周期。 指令周期&#xff1a;取出一条指令并执行这条指令的时间。一般由若干个机器周期组成&#xff0c;是从取指令、分析指令到执行完所需的全部时间。 机器周期&…

时钟周期、机器周期、指令周期的概念及三者之间的关系;定时器及计数器

时钟周期 时钟周期也称为振荡周期&#xff0c;定义为时钟脉冲的倒数(可以这样来理解&#xff0c;时钟周期就是单片机外接晶振的倒数&#xff0c;例如12M的晶振&#xff0c;它的时间周期就是1/12 us)&#xff0c;是计算机中最基本的、最小的时间单位。 在一个时钟周期内&#xf…

如何理解时钟周期及公式CPU执行时间 = CPU时钟周期数/主频

因为用OneNote制作的&#xff0c;公式复制不过来太麻烦&#xff0c;直接截图了。 下面看一下时钟周期的定义&#xff1a; CPU时钟周期&#xff1a;通常为节拍脉冲或T周期&#xff0c;即主频的倒数&#xff0c;它是CPU中最小的时间单位&#xff0c;每个动作至少需要一个时钟周期…

51/时钟周期、时钟频率、状态周期、机器周期

1.时钟频率是什么&#xff1f; 时钟&#xff1a;顾名思义&#xff0c;时钟以精确和固定的时间间隔&#xff0c;触发电信号&#xff0c;其信号被控制单元用于推进CPU的内部操作。而CPU执行 取指令–解码–执行的速度为时钟速度&#xff08;时钟频率&#xff09;。 在各类CPU当中…

时钟周期,机器周期,指令周期的区别

时钟周期 时钟周期也称为振荡周期&#xff0c;定义为时钟脉冲的倒数&#xff08;时钟周期就是单片机外接晶振的倒数&#xff0c;例如12M的晶振&#xff0c;它的时钟周期就是1/12us&#xff09;&#xff0c;是计算机中的最基本的、最小的时间单位。 在一个时钟周期内&#xff0c…