读Flask:before(after)_request

Flask中可以使用@before_request等装饰器来注册一些函数,这些函数会在view_func之前被执行,通常可以用来做数据库初始化等操作。

1
2
3
4
5
6
7
8
9
10
def before_request(self, f):
"""Registers a function to run before each request."""
self.before_request_funcs.append(f)
return f

def preprocess_request(self):
for func in self.before_request_funcs:
rv = func()
if rv is not None:
return rv

从上面的源码可以看出来,被装饰的函数会被注册到Flask实例的before_request_funcs数列中,而在call view_func之前,会遍历这个数列并执行这些函数,并且如果有返回值的话,停止遍历并把返回值作为view_func的返回值进行返回。
在Flask v0.1中还没有before_first_request,不过根据这个思路来也很容易实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Flask(object):
def __init__(self, ...):
self.initiated = False
self.before_first_request_funcs = []
...
...
def before_first_request(self, f):
self.before_first_request_funcs.append(f)
return f

def preprocess_request(self):
if not self.initiated:
for func in self.before_first_request_funcs:
rv = func()
if rv is not None:
return rv
self.initiated = True

for func in self.before_request_funcs:
rv = func()
if rv is not None:
return rv