引言 本文主要梳理了flask的current_app, request, session, g的实现原理 源码说明 本文使用flask 0.5 版本 application context 和request context flask有两个context: application context和request context 这里需要通俗地解释一下application context与request context:
下面通过源码了解一下 flask 如何实现这两种context:
flask 使用_RequestContext的代码如下:
在Flask类中,每次请求都会调用这个request_context函数。这个函数则会创建一个_RequestContext对象。 值得注意的是:这个对象在创建时,将Flask实例的本身作为实参传入_RequestContext自身,因此, self.app = Flask()。 所以,虽然每次http请求都会创建一个_RequestContext对象,但是,每次创建的时候都会将同一个Flask对象传入该对象的app成员变量,使得:
通过在Flask对象中创建_RequestContext对象,并将Flask自身作为参数传入_RequestContext对象的方式,实现了多个request context对应一个application context 的目的。 接下来,看self.request = app.request_class(environ)这句。 由于app成员变量就是app = Flask(__name__)这个对象,所以,app.request_class就是Flask.request_class。 在Flask类的定义中:
所以: self.request = app.request_class(environ)实际上是创建了一个Request对象。 由于,一个http请求对应一个_RequestContext对象的创建,而每个_RequestContext对象的创建对应一个Request对象的创建,所以,每个http请求对应一个Request对象。 到这里想必已经很清楚了: application 就是指app = Flask(__name__)对象 request 就是对应每次http 请求创建的Request对象 flask通过_RequestContext将app与Request关联起来 总结
|
|
来自: River_LaLaLa > 《Python》