flask 上下文的实现,flask上下文实现,这个函数则会创建一个_R
flask 上下文的实现,flask上下文实现,这个函数则会创建一个_R
引言
本文主要梳理了flask的current_app, request, session, g的实现原理
源码说明
本文使用flask 0.5 版本
application context 和request context
flask有两个context: application context
和request context
application context | request context | |
---|---|---|
current_app | request | |
g | session |
这里需要通俗地解释一下application context与request context:
- application 指的就是当你调用
app = Flask(__name__)
创建的这个对象app
; - request 指的是每次
http
请求发生时,WSGI server
(比如gunicorn)调用Flask.__call__()
之后,在Flask
对象内部创建的Request
对象; - application 表示用于响应WSGI请求的应用本身,request 表示每次http请求;
- application的生命周期大于request,一个application存活期间,可能发生多次http请求,所以,也就会有多个request
下面通过源码了解一下 flask 如何实现这两种context:
Python# 代码摘选自flask 0.5 中的ctx.py文件, 进行了部分删减 class _RequestContext(object): def __init__(self, app, environ): self.app = app self.request = app.request_class(environ) self.session = app.open_session(self.request) self.g = _RequestGlobals()
flask 使用_RequestContext
的代码如下:
class Flask(object): def request_context(self, environ): return _RequestContext(self, environ)
在Flask
类中,每次请求都会调用这个request_context
函数。这个函数则会创建一个_RequestContext
对象。
值得注意的是:这个对象在创建时,将Flask
实例的本身作为实参传入_RequestContext
自身,因此,
self.app = Flask()
。
所以,虽然每次http请求都会创建一个_RequestContext
对象,但是,每次创建的时候都会将同一个Flask
对象传入该对象的app
成员变量,使得:
由同一个
Flask
对象响应的请求所创建的_RequestContext
对象的app
成员变量都共享同一个application
通过在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
类的定义中:
request_class = Request # Request 是一个类,定义如下: class Request(RequestBase): ...
所以:
self.request = app.request_class(environ)
实际上是创建了一个Request
对象。
由于,一个http请求对应一个_RequestContext
对象的创建,而每个_RequestContext
对象的创建对应一个Request
对象的创建,所以,每个http请求对应一个Request
对象。
到这里想必已经很清楚了:
application 就是指app = Flask(__name__)
对象
request 就是对应每次http 请求创建的Request
对象
flask通过_RequestContext
将app
与Request
关联起来
总结
app = Flask(__name__)
创建了application, 这个application对应的上下文,就是application contextFlask
每响应一个http请求,就会创建一个Request
对象,这个request对象对应的上下文,就是request context
相关内容
- flask route设计思路,flaskroute, 首先,从WSGI协议的
- Flask信号机制(signals),flasksignals, 信号(signals)
- Flask web 开发(1):安装,flaskweb,希望通过记录技术笔记的
- Flask web开发(2):程序的基本结构,flask基本结构,希望通过
- Flask web开发(3):模板,flaskweb,希望通过记录技术笔记的方
- 在Windows平台使用IIS部署Flask网站,平台iis部署flask, 涉及
- Flask + Gunicorn + Nginx 部署,flaskgunicorn,Web框架和Web服务器
- 实例讲解基于 Flask+React 的全栈开发和部署,flaskreact,后
- 从零开始搭建论坛(3):Flask框架简介,flask框架,未经
- 从零开始搭建论坛(1):Web服务器与Web框架,web框架
评论关闭