测试烧瓶 - 避免循环导入

时间:2015-03-05 04:52:40

标签: python flask flask-sqlalchemy flask-testing

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

  

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

事实上,这还没有在我的应用程序中造成任何问题,如果我删除此行,我的应用程序将无法运行。但是,我的副项目已经足够大,我决定尝试使用Flask-Testing编写单元测试。在他们的所有文档中,他们只是from package import app正常,就像我的应用程序中的每个子模块一样。但是,如果我在主程序包目录中删除tests.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的文档以及Mega-Tutorial section on Unit Testing等其他地方,此导入已完成,似乎“正常工作”。但是,对我来说,这是我唯一一次遇到此循环导入问题。我错过了什么?

1 个答案:

答案 0 :(得分:0)

根据记录here,您的my_app/__init__.py应如下所示:

from flask import Flask

app = Flask(__name__)
from my_app import views

请注意,在导入app之前,views已定义为。如果您遵循该规则,则不会出现任何循环导入问题。