¿Puedo evitar las importaciones circulares en Flask y 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 

Realmente no me gusta que mis submódulos dependan de sus padres. ¿También se pueden evitar las variables del paquete global? Quiero una solución más OO.

Una alternativa para la aplicación es usar Blueprints, creo, pero luego pierdo el decorador de ruta. Tampoco se puede hacer lo mismo para db con SQLAlchemy (¿o sí?).

Eche un vistazo a este proyecto: https://github.com/sloria/cookiecutter-flask
Es un gran ejemplo para hacer las cosas de la manera correcta. Se utilizan muchas de las excelentes funciones de Flask: planos, fábricas de aplicaciones y más.

Aquí es cómo se registran extensiones, como la base de datos 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) ... 

Trate de usar 3er. Creamos el archivo exts.py para crear una instancia de SQLAlchemy como este:

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) 

modelos.py

 from .exts import db class XXXModel(db.Model): pass