Flask【第三章】:Flask中的reques
Flask中的request
每个框架中都有处理请求的机制(request),但是每个框架的处理方式和机制使不同的。接下来我们一个个来看看,在Flask中的request是怎么玩的。
一、request的各参数
玩之前还是那样需要我们先导入request。
from flask import request
1. request.method
说明:这是获取request的请求方式
演示:这里以登录为例
前端代码:
# 使用get方式发送请求 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="" method="get"> 用户名:<input type="text" name="username"><br/> 密码:<input type="password" name="pwd"><br/> <input type="submit" value="登录"> </form> </body> </html>
后端代码:
from flask import Flask,render_template,request app = Flask(__name__) @app.route("/login",methods=["GET","POST"]) #指定允许的请求方式 def login(): print("method:",request.method) return render_template("login.html") app.run("192.168.13.69","5000",debug=True)
后端输出:
修改前端代码为post方式
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="" method="post"> 用户名:<input type="text" name="username"><br/> 密码:<input type="password" name="pwd"><br/> <input type="submit" value="登录"> </form> </body> </html>
在浏览器中输入用户密码后点击登录发送post请求,后端输出如下:
2. request.form
说明:获取存放在Formdata中的数据,以一个类似字典的格式输出。
示例:这里以登录为例
前端代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="" method="post"> 用户名:<input type="text" name="username"><br/> 密码:<input type="password" name="pwd"><br/> <input type="submit" value="登录"> </form> </body> </html>
后端代码:
from flask import Flask,render_template,request app = Flask(__name__) @app.route("/login",methods=["GET","POST"]) def login(): print("form:",request.form) return render_template("login.html") app.run("192.168.13.69","5000",debug=True)
前端输入用户名密码后,后端输出:
form: ImmutableMultiDict([('username', 'root'), ('pwd', '123')])
3. request.args
说明:获取存放在URL也就是地址栏中的数据。
示例:这里以登录为例
前端代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="" method="get"> 用户名:<input type="text" name="username"><br/> 密码:<input type="password" name="pwd"><br/> <input type="submit" value="登录"> </form> </body> </html>
后端代码:
from flask import Flask,render_template,request app = Flask(__name__) @app.route("/login",methods=["GET","POST"]) def login(): print("args:",request.args) return render_template("login.html") app.run("192.168.13.69","5000",debug=True)
前端输入用户名密码后,后端输出:
args: ImmutableMultiDict([('username', 'admin'), ('pwd', '123')])
4. request.url
说明:获取访问的完整路径
示例:这里以登录为例
地址栏输入地址:
http://192.168.13.69:5000/login?username=admin&pwd=123
后端代码:
from flask import Flask,render_template,request app = Flask(__name__) @app.route("/login",methods=["GET","POST"]) def login(): print("url:",request.url) return render_template("login.html") app.run("192.168.13.69","5000",debug=True)
输入地址后,后端输出:
url: http://192.168.13.69:5000/login?username=admin&pwd=123
5. request.path
说明:获取路由地址
示例:这里以登录为例
地址栏输入地址:
http://192.168.13.69:5000/login?username=admin&pwd=123
后端代码:
from flask import Flask,render_template,request app = Flask(__name__) @app.route("/login",methods=["GET","POST"]) def login(): print("path:",request.path) return render_template("login.html") app.run("192.168.13.69","5000",debug=True)
输入地址后,后端输出:
path: /login
6. request.host
说明:获取主机地址(包括端口号)
示例:这里以登录为例
地址栏输入地址:
http://192.168.13.69:5000/login?username=admin&pwd=123
后端代码:
from flask import Flask,render_template,request app = Flask(__name__) @app.route("/login",methods=["GET","POST"]) def login(): print("host:",request.host) return render_template("login.html") app.run("192.168.13.69","5000",debug=True)
输入地址后,后端输出:
host: 192.168.13.69:5000
7. request.values
说明:获取Formdata 和Url中的数据,注意的时,不要使用to_dict,因为会覆盖相同的key。to_dict后面会说。
示例:这里以登录为例
前端代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="" method="post"> 用户名:<input type="text" name="username"><br/> 密码:<input type="password" name="pwd"><br/> <input type="submit" value="登录"> </form> </body> </html>
地址栏输入地址:
http://192.168.13.69:5000/login?username=admin&pwd=123
后端代码:
from flask import Flask,render_template,request app = Flask(__name__) @app.route("/login",methods=["GET","POST"]) def login(): print("values:",request.values) return render_template("login.html") app.run("192.168.13.69","5000",debug=True)
后端输出:
values: CombinedMultiDict([ImmutableMultiDict([('username', 'admin'), ('pwd', '123')]), ImmutableMultiDict([('username', 'root'), ('pwd', '666')])])
8. request.json
说明:如果提交时请求头中的Content-Type:application/json字典操作,那就将其序列化成字典
注意:在做前后端分离时,一定要商议好Content-Type类型。在此不做演示了
9. request.data
说明:如果提交时请求头中的Content-Type无法被识别或者没有此信息,flask会将请求体中的原始数据(就是一堆字节)存放在request.data中。
在此不做演示
10. request.cookies
说明:获取Cookies中的数据
在此不做演示
11. request.headers
说明:获取请求头信息
在此不做演示
12. request.files
说明:序列化文件存储,用来处理删除的文件,使用save来保存上传的文件
演示:上传一个图片到服务器,服务器保存下来。
前端代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="" method="post" enctype="multipart/form-data"> 文件:<input type="file" name="my_file"> <input type="submit" value="上传"> </form> </body> </html>
后端代码:
from flask import Flask,render_template,request app = Flask(__name__) @app.route("/login",methods=["GET","POST"]) def login(): if request.method == "GET": return render_template("login.html") my_file = request.files.get("my_file") my_file.save(my_file.filename) return "上传成功" app.run("192.168.13.69","5000",debug=True)
注意:在save函数中,必须指定保存的文件名,my_file.filename指的是用原文件名,也可以自定义文件名。
结果显示:
二、关于to_dict参数
根据字面我们可以得知,是将类似字典格式的数据转换成字典格式。所有的类似字典格式的数据都可以通过此参数进行转换。
比如:request.form得到的是一个类似字典格式的数据,我们可以使用request.form.to_dict()将其转换成字典格式:
示例:
前端代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="" method="post"> 用户名:<input type="text" name="username"><br/> 密码:<input type="password" name="pwd"><br/> <input type="submit" value="登录"> </form> </body> </html>
后端代码:
from flask import Flask,render_template,request app = Flask(__name__) @app.route("/login",methods=["GET","POST"]) def login(): print("form:",request.form.to_dict()) return render_template("login.html") app.run("192.168.13.69","5000",debug=True)
后端输出:
form: {'username': 'zjk', 'pwd': '123'}