前言:
在tag为0.2和0.3的版本中,flask的一次request请求过程没有发生太大的改变。
增加的内容:
1·tag为0.2版本中 增加模块化的支持,应该就是blueprint的前身。目的也是为了更好的管理大型项目。
例如:
app = Flask(__name__)
app.register_module(admin, url_prefix='/admin')
app.register_module(frontend)
就注册了两个模块。针对模块主要区别有:
- module的url会默认添加url_prefix
- 有模块专属的 before_request, context_precessor等函数
def register_module(self, module, **options):
options.setdefault('url_prefix', module.url_prefix)
state = _ModuleSetupState(self, **options)
for func in module._register_events:
func(state)
在register_module函数中主要是对module的一些函数进行调用,例如注册路由,注册before_request函数等。
def preprocess_request(self):
funcs = self.before_request_funcs.get(None, ())
mod = request.module
if mod and mod in self.before_request_funcs:
funcs = chain(funcs, self.before_request_funcs[mod])
for func in funcs:
rv = func()
if rv is not None:
return rv
在preprocess_request函数中将module的before_request函数chain起来一并执行
2.增加了logger模块
def logger(self):
from logging import getLogger, StreamHandler, Formatter, DEBUG
class DebugHandler(StreamHandler):
def emit(x, record):
if self.debug:
StreamHandler.emit(x, record)
handler = DebugHandler()
handler.setLevel(DEBUG)
handler.setFormatter(Formatter(self.debug_log_format))
logger = getLogger(self.import_name)
logger.addHandler(handler)
return logger
3.还有很好用得 jsonify函数。RESTFul中经常需要使用到这个函数
4.可以在with语句内手动压入或者弹出request_context了。得益于_RequestContext添加了pop和push函数。而且在shell中不需要with语句就可以使用request_context了,在测试的时候十分方便
ctx = app.test_request_context()
ctx.push()
request.path
ctx.pop()