ImportError: cannot import name 'db'

ImportError: cannot import name 'db'

我正在努力将 flask admin 添加到一个预先存在的 flask 样板项目中。我已经能够让基本项目在 https://github.com/kc1/flask-base 运行(屏幕截图)。我现在需要添加模型视图来添加基本的 CRUD 功能。为此,我将代码更改为:

adm = Admin(app,name='flaskadmin')
from app.models import User
adm.add_view(ModelView(User, db.session))

你可以看到它有效。但是如果我在 app/init 的顶部导入 User 模型和其余的导入,我得到:

Traceback (most recent call last):
  File "...flask-base/manage.py", line 10, in <module>
    from app import create_app, db
  File "E:\ENVS\r3\flask-base\app\__init__.py", line 17, in <module>
    from app.models import User
  File "E:\ENVS\r3\flask-base\app\models\__init__.py", line 6, in <module>
    from .user import *  # noqa
  File "E:\ENVS\r3\flask-base\app\models\user.py", line 7, in <module>
    from .. import db, login_manager
ImportError: cannot import name 'db'

为什么?

User 是一个 Flask-SQLAlchemy 模型,它使用 SQLalchemy 的 API 包装模型。它从 db 对象继承其所有模型,我假设您正在 create_app 方法中实例化或注册该对象。

所以,你应该有这样的东西

db = SQLAlchemy()

def create_app(config):
    app = Flask(__name__)
    db.init_app(app)

    adm = Admin(app,name='flaskadmin')
    from app.models import User
    adm.add_view(ModelView(User, db.session))
    return app

每当您从 user.py 导入 User 时,您基本上是在导入 db.Model,这需要 db 存在并实际包含数据。警惕 Flask 中的 和一般的 Python。

错误回溯中清楚地说明了您收到的错误

  File "E:\ENVS\r3\flask-base\app\models\user.py", line 7, in <module>
    from .. import db, login_manager
ImportError: cannot import name 'db'

这是,在 user.py 中从 ../__init__.py 导入了 db,但在该文件中,在 User 的定义之前导入了 User =14=]。

一个 db 对象模拟 declarative approach from SQLAlchemy,其中该对象保存从它继承的所有其他 Class 的数据。