python - 烧瓶导入错误
问题描述
一般来说,我的第一步是使用 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'
在我看来,这db
在models.py
? 这是循环导入的问题吗?如果是,我该如何解决?
编辑我可能在我的虚拟环境中搞砸了一些事情(我想我同时运行了 pipenv 和 autoenv)并且 pip/python2/python3 存在一些混淆。但我怀疑这与问题有关。这个应用程序肯定在 3.6.5 上运行
解决方案
您正在努力解决称为“循环导入问题”的问题。在这种情况下,它会像这样发生。
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
.
推荐阅读
- c# - 用星号打印一个直角三角形c#
- c++ - 内部结构初始化不起作用 - C++
- excel - 通过 SSIS 目录 (SSISDB) 加载大型 Excel 文件时,SSIS 包执行失败
- html - 棱角材料设计的面板
- crystal-lang - 以 JSON 形式返回 Granite 验证错误
- google-ad-manager - 在 DFP gpt 代码中同时设置页面级 setTargeting 和广告位级 setTargeting 是否有效?
- android - 无需 Root 以编程方式启用/禁用移动数据(棒棒糖及更高版本)
- python - 使用 Python 将子文件夹中的图像复制到另一个
- c++ - C++:1-定义一个变量来保存和打印答案,2-和只打印答案有什么不同?
- excel - 在 Excel 中格式化为表格