Python 我能在烧瓶和炼金术中避免循环导入吗
app/init.py: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 我真的不喜欢我的子模块依赖于它们的父模块。也可以避
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