首页 > 解决方案 > 烧瓶导入错误

问题描述

一般来说,我的第一步是使用 Flask 和 python。我正在尝试使用 Flask-Admin 构建一个非常基本的应用程序来构建模型视图页面。

Flask 和 Flask-Admin 中的所有代码示例都可以正常运行,并且 ModelView 可以在我的数据库上运行基本的 CRUD。

但是,当我使用单独的models.py文件(来自本教程)时,事情就出错了。

应用程序.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()

模型.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'

在我看来,这dbmodels.py? 这是循环导入的问题吗?如果是,我该如何解决?

编辑我可能在我的虚拟环境中搞砸了一些事情(我想我同时运行了 pipenv 和 autoenv)并且 pip/python2/python3 存在一些混淆。但我怀疑这与问题有关。这个应用程序肯定在 3.6.5 上运行

标签: pythonflask

解决方案


您正在努力解决称为“循环导入问题”的问题。在这种情况下,它会像这样发生。

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.


推荐阅读