在一般情况下,我开始使用烧瓶和蟒蛇。我正在尝试构建一个非常基本的应用程序,使用烧瓶管理来构建一个模型视图页面。
所有的代码样本都是从Flask和Flask中运行的,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中是不可用的?这是循环进口的问题吗?如果是的话,我如何解决这个问题?
编辑:我可能把wrt (我的虚拟环境)搞砸了(我认为我同时运行了pipenv和autoenv ),并且与pip / python2 / python3有一些混淆。但我怀疑这和问题有什么关系。这个应用程序绝对运行在3.6.5上
发布于 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,它看起来像
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的末尾导入它。
https://stackoverflow.com/questions/54056892
复制相似问题