Flask 循环依赖

2024-04-09

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

https://realpython.com/blog/python/flask-by-example-part-2-postgres-sqlalchemy-and-alembic/ 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/extensions.py
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
...


# app/app.py
from app.extensions import db

def create_app(config_object=ProdConfig):
    app = Flask(__name__.split('.')[0])
    app.config.from_object(config_object)
    register_extensions(app)
    ...

def register_extensions(app):
    db.init_app(app)
    ...

# manage.py
from yourapp.app import create_app
app = create_app()
app.debug = True
...

在这种情况下,database, app,并且您的模型都位于单独的模块中,并且不存在冲突或循环导入。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flask 循环依赖 的相关文章

随机推荐