ImportError: невозможно импортировать имя 'db' - PullRequest
0 голосов
/ 12 мая 2018

enter image description here

Я работаю над добавлением администратора колбы в существующий проект котельной плиты колбы.Я смог заставить базовый проект работать на https://github.com/kc1/flask-base (СКРИНШОТ).Теперь мне нужно добавить вид модели, чтобы добавить базовую функциональность CRUD.Для этого я изменил код на:

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

enter image description here

Вы можете видеть, что это работает.Но если я импортирую модель User с остальной частью импорта вверху приложения / init, я получу:

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'

Почему?

1 Ответ

0 голосов
/ 14 мая 2018

User - это модель Flask-SQLAlchemy, которая оборачивает модели, используя API-интерфейс SQLalchemy.Он наследует все свои модели от объекта 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 из user.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'

Это означает, что в user.py есть импорт db из ../__init__.py, но в этом файлеимпорт User происходит до определения db.

Объект db эмулирует подход declarative из SQLAlchemy , где объект содержит данные обо всех других классах, унаследованных от него.

...