Flask
项目,项目结构如下:
app/__init__.py
中使用from app.home import home as home_blueprint
引入home
;
home/__init__.py
中的代码如下:
from flask import Blueprint
home = Blueprint('home', __name__)
import app.home.views
而app/home/views.py
中的代码如下:
from . import home
@home.route('/')
def index():
return 'Home Page'
开头的from . import home
是从home/__init__.py
中import
的吧?而home/__init__.py
结尾又用import app.home.views
从views.py
导入内容,这样不会产生循环引用吗?
1、这是 flask 项目,我们可以明确一点,所有的模块操作都是在当前的操作目录下进行的,也就是说,导入模块的时候,不会涉及到
sys.__path__
。2、所有的模块导入,都是为了载入内存,那么在载入内存在前,我们 Python 会将要导入的模块都加入到
sys.modules
这个字典中,并将模块的名字都加入正在调用 import 的模块的 Local 命名空间。3、我们复盘一下 flask 项目中的包/模块导入。
3.1、app/__init__.py中使用
from app.home import home as home_blueprint
引入home
,这里的动作是,将home
这个包名及路径,保存到sys.modules
这个字典中,并将home
这个包名引入到app
这个模块的 Local 命名空间了。3.2、
home/__init__.py
结尾又用import app.home.views
从views.py
导入内容。同样会把views
的包名及路径,保存到sys.modules
中,并将将views
这个包名引入到home
这个模块的 Local 命名空间。提示:
一个模块不会重复导入。到此,一切看似都还正常。
4、但是,重点是
views
里还需要导入蓝图home
,这很明显就是循环导入的问题了。记住,循环导入问题 是个真正的问题,会导致ModuleNotFoundError: No module named
错误。但是循环导入是可以破解的,那就是写在home/__init__.py
文本内容的最后面。5、如果写在前面呢??
home/__init__.py
中home = Blueprint('home', __name__)
就是在定义home
这个包,在你没有定义完成之前,涉及到调用home
本身,肯定会报错。所以,写在之前或之后的问题就是以蓝图创建的代码home = Blueprint('home', __name__)
为基准。