我可以在Flask和SQLAlchemy中避免循环导入

时间:2017-03-20 17:12:00

标签: python flask flask-sqlalchemy

应用程序/的初始化的.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也是如此(或者可以吗?)。

2 个答案:

答案 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,如下所示:

exts.py

from flask_sqlalchemy import SQLAlchemy
from flask_xxx import xxx

db = SQLAlchemy()
...

run.py

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)

models.py

from .exts import db


class XXXModel(db.Model):
    pass