请求对象request封装了从客户端发来的请求报文,我们能从他获取请求报文中的所有数据。
请求解析和响应封装实际上大部分是有werkzeug完成的,flask子类化werkzeug的请求和响应对象并添加了和程序相关的特定功能。
假设请求的url是http://just.com/hi?name=kevin, 当flask接收到请求后,请求对象会提供多个属性来获取url的各个部分,常用的属性如下:
属性 | 值 |
---|---|
path | /hi |
full_path | /hi?name=kevin |
host | just.com |
host_url | http://just.com/ |
base_url | http://just.com/hi |
url | http://just.com/hi?name=kevin |
url_root | http://just.com/ |
除了url,请求报文中的其他信息都可以通过request对象提供的属性和方法获取,常见的如下:
属性/方法 | 说明 |
---|---|
args | werkzeug的immutablemultidict对象。存储解析后的查询字符串,可通过字典方式获取键值。如果需要获取未解析的原生查询字符串,可以使用query_string属性 |
blueprint | 当前蓝本的名称 |
cookies | 一个包含所有随请求提交的cookies的字典 |
data | 包含字符串形式的请求数据 |
endpoint | 与当前请求相匹配的端点值 |
file | werkzeug的multidict对象,包含所有上传文件,可以使用字典的形式获取文件。使用的键为文件input标签中的name属性值,对应的值为werkzeug的filestorage对象,可以调用save()方法并差UN如保存路径来保存文件。 |
form | werkzeug的immutablemultidict对象。与file类似,包含解析后的表单数据。表单字段值通过input标签的name属性值作为键获取。 |
values | werkzeug的combinedmultidict对象,结合了args和form属性的值。 |
get_data(cache=True,as_text=False,parse_form_data=False) | 获取请求中的数据,默认读取为字节字符串(bytestring),将as_text设为True则返回值将是解码后的unicode字符串。 |
get_json(self,force=False,silent=False,cache=True) | 作为json解析并返回数据,如果mime类型不是json,返回None(除非force设为True);解析出错则抛出werkzeug提供的badrequest异常(如果未开启调试模式,则返回400错误响应),如果silent设为True则返回None;cache设置是否缓存解析后的json数据。 |
headers | 一个werkzeug的environheaders对象,包含首部字段,可以以字典的形式操作 |
is_json | 通过mime类型判断是否为json数据,返回布尔值 |
json | 包含解析后的json数据,内部调用了get_json(),可通过字典的形式获取键值 |
method | 请求的http方法 |
referrer | 请求发起的源url |
scheme | 请求的url模式(http还是https) |
user_agent | 用户代理(user Agent,UA),包含了用户的客户端类型,操作系统类型等信息 |
werkzeug的multidict类是字典的子类,它主要实现了同一个键对应多个值的情况。比如一个文件上传字段可能会接受多个文件,这时就可以通过getlist()方法来获取文件对象列表。
immutablemultidict类继承了multidict类,但是其值是不可改变的。
需要注意的是,和普通的字典类型不同,当我们从request对象的类型为multidict或者immutablemultidict的属性(比如files,form,args)中直接使用键作为索引获取数据的时候(比如request.args[‘name’]),如果没有对应的键,那么会返回http400错误响应,表示请求无效,而不是抛出keyerror异常。为了避免这个错误,我们应该使用get()方法获取数据,并且get()方法可以设置默认值(同python中的字典)。