3

我使用 Django 已经有一段时间了,但我决定在我最新的副项目中尝试一下 Flask。因为我不想将整个应用程序放在一个文件中,所以我按照此处的文档将我的 Flask 应用程序打包成一个包。至关重要的是,这些说明引入了一种循环导入:

每个 Python 程序员都讨厌它们,但我们只是添加了一些:循环导入(即两个模块相互依赖。在这种情况下, views.py依赖于__init__.py)。请注意,这通常是一个坏主意,但在这里它实际上很好。这样做的原因是我们实际上并没有使用__init__.py中的视图,而只是确保导入了模块,并且我们在文件的底部这样做。

事实上,这还没有在我的应用程序中造成任何问题,如果我删除此行,我的应用程序将无法运行。然而,我的副项目已经变得足够大,我决定尝试使用Flask-Testing为它编写单元测试。在他们的所有文档中,它们from package import app和我的应用程序中的每个子模块一样正常。但是,如果我将 atests.py放在主包目录中并尝试此导入,然后尝试运行测试,它会因上述循环导入而失败:

File "/home/me/my_app/my_app/__init__.py", line 165, in <module>
  import views
File "/home/me/my_app/my_app/views.py", line 23, in <module>
  from my_app import app, db
ImportError: cannot import name app

在 Flask-Testing 的文档中,以及其他地方,如Unit Testing 的 Mega-Tutorial 部分,此导入已完成并且似乎“正常工作”。然而,对我来说,这是我唯一一次遇到此循环导入问题。我错过了什么?

4

1 回答 1

2

如此所述,您my_app/__init__.py应该如下所示:

from flask import Flask

app = Flask(__name__)
from my_app import views

请注意在从包中导入之前app定义的内容。如果您遵循该规则,则不会有任何循环导入问题。views

于 2015-03-05T13:05:45.210 回答