Python 我能在烧瓶和炼金术中避免循环导入吗

Python 我能在烧瓶和炼金术中避免循环导入吗,python,flask,flask-sqlalchemy,Python,Flask,Flask Sqlalchemy,app/init.py: from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__ name __) db = SQLAlchemy(app) from app import views, models app/models.py: from app import db # I want to avoid this everywhere 我真的不喜欢我的子模块依赖于它们的父模块。也可以避

app/init.py:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__ name __)
db = SQLAlchemy(app)  
from app import views, models
app/models.py:

from app import db  # I want to avoid this everywhere
我真的不喜欢我的子模块依赖于它们的父模块。也可以避免全局包变量吗?我想要一个更面向对象的解决方案


我认为应用程序的一个替代方案是使用蓝图,但后来我失去了路线装饰器。同样,使用SQLAlchemy的db也不能做到这一点(或者可以吗?)。

看看这个项目:
这是一个以正确的方式做事的好例子。使用了许多优秀的烧瓶功能:蓝图等

是如何注册扩展的,例如SQLAlchemy数据库:

# 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)
    ...

试着用第三个。我们创建exts.py文件来实例化SQLAlchemy,如下所示:

exts.py run.py models.py
太好了,我想这正是我想要的。那么基本上在另一个包中定义这些全局变量就不需要循环导入了?这确实清理了混乱。每件物品都有它的位置,它们整齐地工作在一起。我花了很长时间才按照我想要的方式安装好烧瓶。这帮了大忙。非常感谢。我想这是最好的做法。这个答案在代码示例中比公认的答案更完整。关键的补充是,
app
在被调用的python文件中定义,并给定
create\u app()
的返回值,但在哪里写入
db.create\u all()
from flask_sqlalchemy import SQLAlchemy
from flask_xxx import xxx

db = SQLAlchemy()
...
from flask import Flask

from .exts import db, ...


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


def create_app(config):
    app = Flask(__ name __)
    app.config.from_object(config)

    register_extensions(app)

    return app

app = create_app(config)
from .exts import db


class XXXModel(db.Model):
    pass