Flask 模块启动源码分析
2020-07-16 本文已影响0人
noteby
-
通过flask启动脚本,实例化FlaskGroup类,实例化过程会配置routes、run、shell指令。
然后通过该类的main方法加载项目环境变量(安装依赖python-dotenv 可以加载环境变量配置文件.env或者.flaskenv)以及初始化项目启动类ScriptInfo的实例。
这个过程会检查项目并抛出项目异常。 -
执行run命令。
通过DispatchingApp类在实例化过程中,调用ScriptInfo对象的load_app方法加载app(--reload 参数或FLASK_DEBUG 控制app单线程启动还是双线程启动)。
DispatchingApp类实现了可回调方法call(self, environ, start_response)
通过WSGI工具包Werkzeug,加载DispatchingApp的对象以及相关参数开始运行项目。
(Werkzeug是一个WSGI工具包,可以作为一个Web框架的底层库。) -
load_app方法执行内容(实例化app)。
• 如果有设置FLASK_APP的值,将查找并导入对应的模块或者包(可以指定app名称,FLASK_APP=app:micro),
没有设置app名称时,将在导入的模块或者包中查找变量名为app或者application的FLASK实例,没有时再其他FLASK实例的变量,还是没有时继续查找可回调函数(函数名为create_app或者make_app,返回值是FLASK实例)
• 如果没有设置FLASK_APP的值,将直接查找wsgi.py和app.py,同时也会匹配到名为wsgi和app的包 -
热重载方式。
默认通过检查文件属性的方式进行监测(可以安装依赖包watchdog,Werkzeug会自动检测)