使用flask app导入问题

时间:2014-12-29 05:42:26

标签: python flask

我的烧瓶应用程序中有以下结构:

app.py

app = Flask(__name__)
app.config.from_object(os.environ['APP_SETTINGS'])
db = SQLAlchemy(app)
from models import *

models.py

from app import db

在我想对app.py以外的文件中的模型进行读/写操作之前,它工作正常。我尝试在文件Trackorder中导入模型tasks.py但出现以下错误:

ImportError: cannot import name TrackOrder

所以,我改变了结构:

__init__.py

app = Flask(__name__)
app.config.from_object(os.environ['APP_SETTINGS'])
db = SQLAlchemy(app)

但是这会导致appdb中的app.pymodels.py无效:

File "app.py", line 21, in <module>
    from models import *
  File "/home/nish/repos/stage/voylla_api/models.py", line 16, in <module>
    class Product(db.Model):
NameError: name 'db' is not defined

##after commenting models.py:
Traceback (most recent call last):
  File "app.py", line 210, in <module>
    @app.route('/')
NameError: name 'app' is not defined

如何解决此问题?

2 个答案:

答案 0 :(得分:2)

这是一个可以为您效劳的解决方案。

创建一个名为core.py的文件(或任何您想要命名的文件):

from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()

现在在app.py

from core import db

app = Flask(__name__)
app.config.from_object(os.environ['APP_SETTINGS'])

# Instead of this line: db = SQLAlchemy(app)
# Use this approach to initialize db
db.init_app(app)

models.py中,您可以使用此导入from core import db

这是基于此处的示例:https://pythonhosted.org/Flask-SQLAlchemy/api.html

答案 1 :(得分:0)

如果没有包含所有import语句的完整代码,很难说,但您很可能有循环导入。您正在模块A中导入模块B,在模块A中导入模块B. 这有副作用,当你将A导入B(关闭循环的导入)时,A中的B导入下面没有任何内容。例如:

a.py:
from b import * # Now b.py is evaluated before the execution contiues.
var1 = 0

b.py:
import a
print(a.var1) # This raises an error since var1=0 was not executed yet.

解决方案: 重新排序导入或在本地使用import语句,如:

def function1():
    from a import var1
    print(var1)