gpt4 book ai didi

python - Flask 循环依赖

转载 作者:行者123 更新时间:2023-12-03 17:15:56 26 4
gpt4 key购买 nike

我正在开发一个 Flask 应用程序。它仍然相对较小。我只有一个 app.py 文件,但是因为我需要进行数据库迁移,所以我使用本指南将其分为 3 个:

https://realpython.com/blog/python/flask-by-example-part-2-postgres-sqlalchemy-and-alembic/

但是,我现在无法运行我的应用程序,因为应用程序和模型之间存在循环依赖关系。

app.py:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask import render_template, request, redirect, url_for
import os

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = os.environ['DB_URL']
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

app.debug = True

db = SQLAlchemy(app)

from models import User

... routes ...

if __name__ == "__main__":
app.run()

模型.py:
from app import db
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True)
email = db.Column(db.String(120), unique=True)

def __init__(self, username, email):
self.username = username
self.email = email

def __repr__(self):
return self.username

管理.py:
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand
from app import app, db

migrate = Migrate(app, db)
manager = Manager(app)

manager.add_command('db', MigrateCommand)

if __name__ == "__main__":
manager.run()

它们都在同一个目录中。当我尝试运行 python app.py要启动服务器,我收到一个错误,它肯定显示了循环依赖(这很明显)。我在遵循指南时犯了任何错误还是指南错了?我怎样才能将其重构为正确的?

非常感谢。

编辑:回溯
Traceback (most recent call last):
File "app.py", line 14, in <module>
from models import User
File "/../models.py", line 1, in <module>
from app import db
File "/../app.py", line 14, in <module>
from models import User
ImportError: cannot import name User

最佳答案

我追了几个小时,在这里登陆了几次,结果我在创建应用程序的行之前导入了我的页面模块(那些持有 @app.route 命令的模块)。这很容易做到,因为导入命令往往放在最开始,但在这种情况下不起作用。
所以这:

# app/__init__.py
print("starting __init__.py")

from flask import Flask
from flask import render_template
import matplotlib.pyplot as plt
import numpy as np
import mpld3


app = Flask(__name__, instance_relative_config=True)
app.config.from_object('config')

from . import index
from . import simple

app.run(threaded=False)

print("finished __init__.py")
而不是将所有导入都放在首位。
把它放在这里是因为这对于普通 flask 用户来说是一个常见的错误,他们很可能会在这里登陆。在过去的几年里,我至少打了两次。

关于python - Flask 循环依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43077599/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com