在烧瓶应用程序中构建文件而不导入

时间:2015-12-25 16:46:45

标签: python flask directory structure

我在烧瓶应用中遇到了进口问题。

这是我目前的结构

meteor

在我的 app/ __init__.py config.py db_create.py models.py views.py run.py 文件中,我有以下代码:

__init__.py

在我的 from flask import Flask from flask.ext.sqlalchemy import SQLAlchemy app = Flask(__name__) app.config.from_object('config') db = SQLAlchemy(app) from app import views, models 我有以下代码:

run.py

#!flask/bin/python from app import app app.run() 我有:

db_create.py

和我的其余代码创建数据库并添加一些示例数据。

但是,当我尝试运行 from app import db 时,我收到以下错误:

db_create.py

我不确定这里有什么问题,如果是周期性进口或其他问题。

4 个答案:

答案 0 :(得分:0)

app/__init__.py中你有:

app = Flask(__name__)

from app import views, models

那么,app既是包名又是Flask实例?

不要给两件事同名。

并将所有导入放在文件的顶部,这样可以至少简化您的生活。

答案 1 :(得分:0)

您的应用程序存在结构问题。 您可以从run.py导入应用,但不应从app/db_create.py导入该应用。这实际上是循环导入。如果您需要app/__init__.py文件中的某些内容,请将其导出到另一个可以从db_create.py导入的.py文件。

答案 2 :(得分:0)

此方法不起作用,因为您在app内没有变量db_create.py

__init__.py中查看您已初始化名为app的变量。 现在在run.py中,您可以从app导入app directory变量。

现在,由于db_create__init__位于某个目录中,您需要像from __init__ import app一样导入。

虽然我建议不要创建文件db_create.py,而是在__init__.py中使用相同的代码,因为这样做只是为了测试目的。

同样在__init__.py中直接使用import views, models代替from app import views, models (因为它们也在同一目录中)

希望我能够正确解释。

答案 3 :(得分:0)

它试图找到app.py从中插入app对象,但找不到它。如果将其设置为

"from __init__ import app"

会起作用,但这也不是一个好习惯。

如果您准备使用micro app,因为烧瓶擅长并且您可能具有以下结构:

app/
  app.py 
  app.cfg
  db_create.py
  models.py

所有Flask应用初始化和路由都在app.py。

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
from db_create import DbOperations

app = Flask(__name__)
app.config.from_pyfile('app.cfg')
db = SQLAlchemy(app)
db_operations = DbOperations(db)

@app.route("/")
def home():
    db_operations.create() #or something like this
....


if __name__ == '__main__':
    app.run()

然后将大块代码移到app.py之外的类,如db_create.py:

class DbOperations:
         def create(self, db):
         ... some logic