request对象

Flask的request对象封装了从客户端发来的请求报文,可以从它获取请求报文的所有数据

获取请求URL

假设请求的URL是http://helloflask.com/hello?name=Grey,当Flask接收到请求后,请求对象会提供多个属性来获取URL的各个部分,常用的属性如下:

属性


path

/hello

full_path

/hello?name=Grey

host

helloflask.com

host_url

​http://helloflask.com/​

base_url

​http://helloflask.com/hello​

url

​http://helloflask.com/hello?name=Grey​

url_root

​http://helloflask.com/​

获取其他信息

属性/方法

说明

args

存储解析后的查询字符串,可通过字典方式获取键值

blueprint

蓝本的名称

cookies

一个包含所有随请求提交的cookies的字典

data

包含字符串形式的请求数据

endpoint

与当前请求相匹配的端点值

files

包含所有上传文件,可以使用字典的形式获取文件。使用的键为文件input标签中的name属性值,对应的值为Werkzeug的FileStorage对象,可以调用save()方法并传入保存路径来保存文件

form

包含解析后的表单数据,表单字段值通过input标签的name属性值作为键获取

values

结合了args和form属性的值

get_data(cache=True, as_text=False, parse_form_data=False)

获取请求中的数据,默认读取为字节字符串,将as_text设为True则返回值将是解码后的unicode字符串

get_json(self, force=False, silent=False, cache=True

作为JSON解析并返回数据,如果MIME类型不是JSON,返回None;解析出错则抛出BadRequest异常,如果silent设为True则返回None;cache设置是否缓存解析后的JSON数据

headers

包含首部字段,可以以字典的形式操作

is_json

通过MIME类型判断是否为JSON数据,返回布尔值

json

包含解析后的JSON数据,内部调用get_json(),可通过字典的方式获取键值

method

请求的HTTP方法

referrer

请求发起的源URL,即referer

scheme

请求的URL模式(http或https)

user_agent

用户代理(User Agent),包含了用户的客户端类型,操作系统类型等信息

request实例

获取host

from flask import Flask, request

app = Flask(__name__)

@app.route('/hello')
def hello():
host = request.host
return host

Flask Web开发实战:2.2-HTTP请求_json

获取查询字符串

使用get是为了防止没有name的键,而出现的400错误。没有name时,默认为Flask

@app.route('/hello')
def hello():
name = request.args.get('name', 'Flask')
return '<h1>Hello, %s!</h1>' % name

Flask Web开发实战:2.2-HTTP请求_字符串_02

路由匹配

当请求的URL与某个视图函数的URL规则匹配成功时,对应的视图函数就会被调用。使用​​flask routes​​​命令可以查看程序中定义的所有路由,这个列表由app.url_map解析得到
Flask Web开发实战:2.2-HTTP请求_字符串_03

设置请求类型

在​​app.route()​​装饰器中使用methods参数传入一个包含监听的HTTP方法的可迭代对象,比如,下面的视图函数同时监听GET请求和POST请求

@app.route('/hello', methods=['GET', 'POST'])
def hello():
return '<h1>Hello, Flask!</h1>'

URL变量转换器

int转换器

URL中的变量部分默认是字符串,可以将其转换为整型,比如计算时光倒流的年份

@app.route('/goback/<int:year>')
def go_back(year):
return '<p>Welcome to %d!</p>' % (2020 - year)

Flask Web开发实战:2.2-HTTP请求_flask_04

注意
转换时,int和year之间不能有空格,不能写成​​​int: year​​​或者​​int : year​​,否则会出错

any转换器

匹配可选值中的一个元素,如果转换值不在可选值的范围内,会获得4040错误

@app.route('/colors/<any(blue, white, red):color>')
def three_colors(color):
return '<p>Love is patient and kind. Love is not jealous or boastful or proud or rude.</p>'

Flask Web开发实战:2.2-HTTP请求_json_05
Flask Web开发实战:2.2-HTTP请求_字符串_06

等效方法,传入预定义的列表,将列表转换为字符串,作为可选值,​​str(colors)[1:-1])​​​等于​​'blue', 'white', 'red'​

colors = ['blue', 'white', 'red']

@app.route('/colors/<any(%s):color>' % str(colors)[1:-1])
def colors(color):
return '<p>Love is patient and kind. Love is not jealous or boastful or proud or rude.</p>'

内置的URL变量转换器

转换器

说明

string

不包含斜线的字符串(默认值)

int

整型

float

浮点数

path

包含斜线的字符串。static路由的URL规则中的filename变量就使用了这个转换器

any

匹配一系列给定值的一个元素

uuid

UUID字符串

请求钩子

Flask请求钩子

Flask默认实现的五种请求钩子如下:

钩子

说明

before_first_request

注册一个函数,在处理第一个请求前运行

before_request

注册一个函数,在处理每个请求前运行

after_request

注册一个函数,如果没有未处理的异常抛出,会在每个请求结束后运行

teardown_request

注册一个函数,即使有未处理的异常抛出,会在每个请求结束后运行。如果发生异常,会传入异常对象作为参数到注册的函数中

after_this_request

在视图函数内注册一个函数,会在这个请求结束后运行

使用方式

@app.before_request
def do_something():
pass

示意图

Flask Web开发实战:2.2-HTTP请求_flask_07