我的烧瓶应用程序中有以下结构:
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)
但是这会导致app
和db
中的app.py
和models.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
如何解决此问题?
答案 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)