对于 Web 应用,与客户端发送给服务器的数据交互至关重要。在 Flask 中由全局的 request 对象来提供这些信息,比如说GET在url后面追加参数、POST在body中带参数、又或者是POST的表单提交方式,这时候就需要从request
里提取出参数。
这篇文章详细介绍了request对象常用的属性和方法。
导入request
from flask import request
request常用的属性和方法
属性 | 用途 | 类型 |
---|---|---|
data | 记录请求的数据,并转化成字符串 | * |
form | 记录请求中的表单数据 | MultiDict |
args | 记录url中的查询参数 | MultiDict |
cookies | 记录请求中的cookies信息 | Dict |
headers | 记录请求报文头 | EnvironHeaders |
method | 记录请求使用的HTTP方法 | GET/POST/… |
files | 记录上传的文件 | * |
url | 记录请求的URL地址 | string |
- form
从POST或者PUT请求中解析表单数据。如果GET请求将表单数据编码到url里面,而不是放在表单中传输过来的信息,则不能使用form捕捉。使用form解析后是ImmutableMultiDict(一键多值字典)类型。 - args
获得url中携带的params(参数),与传输方式(GET or POST)无关。有时候POST请求也会将参数加入到url中,这种情况下也可以得到args属性。使用args解析后也是ImmutableMultiDict(一键多值字典)类型。
form和args的例子:
浏览器默认的将GET请求的表单数据编码到url中,而不会单独发送表单数据。POST请求的表单通过表单数据传到服务端,而不会编码到url中。利用浏览器这样的特性,就可以通过以下这个例子认识到form和args的区别:
html代码:
<!--通过改变form标签中method属性来改变数据请求的方式-->
<form action="http://127.0.0.1:10001/login" method="POST">
First name:<br/>
<input type="text" name="firstname"><br/>
请选择一个选项:<br/>
<input type="radio" name="sex" value="male" checked>Male<br/>
<input type="radio" name="sex" value="female">Female<br/>
<input type="submit" value="Submit">
</form>
python代码:
from flask import Flask,render_template,request
from time import sleep
app=Flask("submit and catch form element")
#使用request.args来获得表单数据
@app.route("/login",methods=["POST","GET"])
def check_pass():
firstname=request.form.get("firstname")#获取表单中参数的值
sex=request.args.get("sex")#获得url中携带的params(参数),与传输方式(GET or POST)无关
print(firstname)
print(sex)
return render_template("login_success.html")
if __name__=="__main__":
app.run(host="127.0.0.1",port="10001",debug=True)
1.当在HTML中使用POST方法提交表单时,结果如下:
海贼王
None
可以看到request通过form方法获得表单数据,这时,浏览器中请求的url为:http://127.0.0.1:10001/login
。
2.当在HTML中使用GET方法提交表单时,结果如下:
None
male
可以看到request通过args方法获取了url中的params,同时浏览器中请求的url为http://127.0.0.1:10001/login?firstname=%E6%B5%B7%E8%B4%BC%E7%8E%8B&sex=male
。
- values
类型为CombinedMultiDict,内容是form和args的结合。可以通过values代替form和args。 - cookies
返回请求的cookies,类型为dict。 - headers
返回请求头,为字典类型。比如chrome浏览器的请求头打印如下:
Host: 127.0.0.1:10001
Connection: keep-alive
Content-Length: 46
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: null
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site: cross-site
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
- data
包含请求的数据,并转化成字符串,除非是Flask无法处理的mimetype。 - files
获取上传的文件流,可以获得一个文件对象,并保存本地。 - method
获取请求方法,GET或者POST或者其他。 - get_json(force=False,slient=False,cache=True)
- json
如果请求的mimetype是application/json,那么这个参数将会解析json数据,如果不是将会返回None,可以代替上面的get_json()方法。 - path
- script_root
- base_url
- url
- url_root
如果用户请求的url如下面所示:
http://www.lhystrive.com/application/page.html?name=lhy
则上面参数内容如下:
名称 | 显示内容 |
---|---|
path | ./page.html |
script_root | /application |
base_url | http://www.lhystrive.com/application/page.html |
url | http://www.lhystrive.com/application/page.html?name=lhy |
url_root | http://www.lhystrive.com/application/ |
更多具体的内容可以参考下面这个博客,我觉得很不错!!!
【Flask】关于Flask的request属性