Flask SQLAlchemy ImportError: cannot import Form

Flask SQLAlchemy ImportError: cannot import Form

我正在使用 Flask 和 SQLAlchemy 构建一个小问卷,为了进行开发测试,我尝试通过它的 ID 回忆一个随机表单。然而,终端给出了一个 ImportError,但我没有任何以模块命名的文件(如其他 Whosebug 问题)或错误提示的循环导入。如何在这个单独的文件中查询 AddEnqueteForm? enquete_algorithm.py:

from models import AddEnqueteForm
import random
from settings import *
from flask import request

def enq_results(form_id):
    form = AddEnqueteForm.query.all(filter=form_id)
    reliability_dict = {}
    reliability_dict['stelling_set_1'] = algorithm(form.stelling1, form.stelling2)

当然还有 models.py:

from main import db

class AddEnqueteForm(db.Model):
    id = db.Column(db.Integer, primary_key=True)

    stelling1 = db.Column(db.String(4), nullable=False)
    stelling2 = db.Column(db.String(4), nullable=False)

错误:

Traceback (most recent call last):
  File "c:\Users\Enquete\enquete_algorithm.py", line 1, in <module>
    from mods import AddEnqueteForm
  File "c:\Users\Enquete\models.py", line 1, in <module>
    from main import db
  File "c:\Users\Enquete\main.py", line 9, in <module>
    from routes import *
  File "c:\Users\Enquete\routes.py", line 4, in <module>
    from models import AddEnqueteForm
ImportError: cannot import name 'AddEnqueteForm' from partially initialized module 'models' (most likely due to a circular import) (c:\Users\Enquete\models.py)

我意识到有些变量名称有点混乱:AddEnqueteForm 是一个模型,而不是一个表单。我完全在 HTML.

中构建了表格

问题不在于 enquete_algorithm.py。循环导入发生在 routes.py 和 models.py 之间。您在 models.py 中导入 main.py,在 routes.py 中导入 main.py,在 routes.py 中导入 routes.py,在导入 models.py.

为了解决这个问题,我创建了一个单独的文件 database.py,我在其中定义了 db,并从 main.pymodels.py 中的文件中导入了数据库。这样可以防止循环导入。

database.py:

from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
def init_app(app):
    db.init_app(app)

models.py :

from database import db

class AddEnqueteForm(db.Model):
    id = db.Column(db.Integer, primary_key=True)

    stelling1 = db.Column(db.String(4), nullable=False)
    stelling2 = db.Column(db.String(4), nullable=False)

在main.py中你需要导入模型和数据库并使用init_app()初始化数据库。

[...]
from database import db
from models import *
[...]
app = Flask(__name__) 
database.init_app(app)

现在,如果您想通过终端运行 命令db.create_all() 来创建数据库。您需要使用应用程序上下文。

运行执行以下命令将创建数据库。

from main import *
with app.app_context():
     db.create_all()