我正在做一个烧瓶教程(http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-world),我发现了一个我无法解释的行为。 本教程的主要目录结构是:
microblog
|
|---- app
| |---- __init__.py
| |---- views.py
|
|---- flask
|---- run.py
并且文件的内容是:
#!flask/bin/python
from app import app
app.run(debug=True)
from flask import Flask
app = Flask(__name__)
from app import views
from app import app
@app.route("/")
@app.route("/index")
def index():
return "Hello World!"
一切正常但如果我转换这两行:
app = Flask(__name__)
from app import views
在views.py中然后执行run.py我得到:
ImportError:无法导入名称应用
为什么会这样?
答案 0 :(得分:1)
因为您尝试从新创建的变量app
导入。如果要导入变量模块,请使用importlib
包:
my_module = importlib.import_module(app, 'view')
答案 1 :(得分:1)
与其他答案所说的相反,这是一个循环导入问题。 app.__init__
尝试导入app.views
,尝试导入app.app
中创建的Flask
app.__init__
。如果在Flask
导入app.__init__
之前创建app.views
,则app.views
会找到app.app
。如果在导入后创建了Flask
,那么当app.views
尝试找到它时,它就不存在了。
循环进口会引发各种可怕的问题。这可能很困难,但处理它们的最佳方法通常是重新组织代码,以便不进行循环导入。