应用程序/的初始化的.py:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__ name __)
db = SQLAlchemy(app)
from app import views, models
应用程序/ models.py:
from app import db # I want to avoid this everywhere
我真的不喜欢我的子模块依赖于他们的父母。也可以避免全局包变量吗?我想要更多的OO解决方案。
应用程序的一个替代方案是使用我认为的蓝图,但随后我松开了路径装饰器。对于带有SQLAlchemy的db也是如此(或者可以吗?)。
答案 0 :(得分:22)
看看这个项目:https://github.com/sloria/cookiecutter-flask
这是以正确的方式做事的一个很好的例子。使用了许多伟大的Flask功能:蓝图,application factories等等。
Here是他们注册扩展的方式,例如SQLAlchemy Database:
# 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)
...
答案 1 :(得分:2)
尝试使用3rd。我们创建exts.py文件来实例化SQLAlchemy,如下所示:
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