首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >烧瓶ImportError

烧瓶ImportError
EN

Stack Overflow用户
提问于 2019-01-05 22:32:20
回答 1查看 733关注 0票数 0

在一般情况下,我开始使用烧瓶和蟒蛇。我正在尝试构建一个非常基本的应用程序,使用烧瓶管理来构建一个模型视图页面。

所有的代码样本都是从Flask和Flask中运行的,ModelView可以在我的数据库上运行基本CRUD。

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

app.py

代码语言:javascript
复制
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

代码语言:javascript
复制
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时,我得到:

代码语言:javascript
复制
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

代码语言:javascript
复制
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中是不可用的?这是循环进口的问题吗?如果是的话,我如何解决这个问题?

编辑:我可能把wrt (我的虚拟环境)搞砸了(我认为我同时运行了pipenv和autoenv ),并且与pip / python2 / python3有一些混淆。但我怀疑这和问题有什么关系。这个应用程序绝对运行在3.6.5上

EN

回答 1

Stack Overflow用户

发布于 2019-01-06 06:13:34

你的工作方式被称为“循环进口问题”。在这种情况下,事情就这样发生了。

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,它看起来像

代码语言:javascript
复制
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的末尾导入它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54056892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档