导入错误:无法导入名称“db”

use*_*629 6 python flask flask-admin

在此处输入图片说明

我正在将烧瓶管理员添加到预先存在的烧瓶样板项目中。我已经能够在https://github.com/kc1/flask-base (SCREENSHOT) 上运行基本项目。我现在需要添加模型视图来添加基本的 CRUD 功能。为此,我将代码更改为:

adm = Admin(app,name='flaskadmin')
from app.models import User
adm.add_view(ModelView(User, db.session))
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

你可以看到它有效。但是如果我在 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'
Run Code Online (Sandbox Code Playgroud)

为什么?

blu*_*onk 18

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
Run Code Online (Sandbox Code Playgroud)

每当您Useruser.py您导入时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'
Run Code Online (Sandbox Code Playgroud)

也就是说,在fromuser.py的导入中db../__init__.py但在该文件中,User在 的定义之前发生了导入db

db对象模拟了declarative从SQLAlchemy的方法,其中所述对象具有从它继承所有其他类数据。

  • 谢谢,这是一个很好的答案!我认为我遇到的一个问题是理解在像这样的更复杂的 Flask 项目中运行 Flask 文件时执行它们的顺序。稍后我会就此提出一个后续问题。 (2认同)