Flask ImportError - PullRequest
       2

Flask ImportError

0 голосов
/ 06 января 2019

Первые шаги с Flask и python в целом. Я пытаюсь создать очень простое приложение, используя Flask-Admin для создания страницы просмотра модели.

Все примеры кода из Flask и Flask-Admin работают так, как должны, и ModelView может запускать базовый CRUD в моей базе данных.

Но, когда я использую отдельный models.py файл (из этого урока ), все идет не так.

app.py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_admin import Admin
from flask_admin.contrib.sqla import ModelView

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = "sqlite:///database/db.db"
app.config['FLASK_ADMIN_SWATCH'] = 'flatly'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)

from models import *

class PostView(ModelView):
    edit_modal = True

admin = Admin(app, name='ProjectX', template_mode='bootstrap3')
admin.add_view(PostView(Post, db.session))
if __name__ == '__main__':
    app.run()

models.py

from app import db

class Post(db.Model):
    __tablename__ = 'post'

    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(255), unique=True, nullable=False)
    text = db.Column(db.String(255), unique=False, nullable=False)

    def __repr__(self):
    return '<Post {}>'.format(self.title)

Когда я бегу python app.py, я получаю:

Traceback (most recent call last):
  File "app.py", line 12, in <module>
    from models import *
  File "/Users/me/Sites/projectx/models.py", line 1, in <module>
    from app import db
  File "/Users/me/Sites/projectx/app.py", line 18, in <module>
    admin.add_view(PostView(Post, db.session))
NameError: name 'Post' is not defined

Когда я меняю from models import * на from models import Post, я получаю

Traceback (most recent call last):
  File "app.py", line 12, in <module>
    from models import Post
  File "/Users/me/Sites/projectx/models.py", line 1, in <module>
    from app import db
  File "/Users/me/Sites/projectx/app.py", line 12, in <module>
    from models import Post
ImportError: cannot import name 'Post'

Мне кажется, что db недоступно в models.py? Это проблема с циклическим импортом, и если да, как я могу это исправить?

EDIT Возможно, я что-то напутал с моей виртуальной средой (думаю, у меня запущены как pipenv, так и autoenv), и есть некоторая путаница с pip / python2 / python3. Но я сомневаюсь, что это как-то связано с проблемой. Это приложение определенно работает на 3.6.5

1 Ответ

0 голосов
/ 06 января 2019

Вы пробились к тому, что называется «проблема кругового импорта». В этом случае это происходит так.

Python начинает синтаксический анализ / оценку app.py. На полпути он находит from models import * (или один из других вариантов, которые вы пробовали).

Разбор / оценка app.py временно приостановлена ​​для получения символов из models.

Python начинает синтаксический анализ / оценку models.py и сразу же встречает from app import db.

По очень немного запутанным (но разумным) причинам Python затем хочет завершить разбор / оценку app.py, но когда это происходит, он встречает ссылку на Post, которая еще не была определена, потому что Разбор / оценка models.py была приостановлена. Затем Python поднимает NameError.

Самый простой способ, которым я знаю, разрешить это - создать отдельный views.py, который будет выглядеть примерно так:

from app import admin, db
from models import Post
from flask_admin.contrib.sqla import ModelView

class PostView(ModelView):
    edit_modal = True
admin.add_view(PostView(Post, db.session)

затем импортируйте его в конце app.py после того, как вы импортировали models.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...