Насколько я помню Flask, то циклические импорты, при работе с моделями, в нем хорошо лечатся следующим образом:
1. Создаем файл database.py, в котором у нас будет лежать главный объект модели:
from flaskext.sqlalchemy import SQLAlchemy
db = SQLAlchemy()
Именно к этому объекту мы прикрепляем все модели SQLAlchemy. Здесь важно выделение именно в отдельный файл - поможет избежать циклических ссылок
2. Для создания объекта приложения используем фабрику приложений:
from myproject import database
#: Строка соединения с базой данных
SQLALCHEMY_DATABASE_URI = 'sqlite://'
def create_app(config=None):
"""
Фабрика приложений
"""
# Это создаваемое приложение
app = Flask(__name__)
# Сначала загружаем конфигурацию из текущего модуля - SQLALCHEMY_DATABASE_URI
app.config.from_object(__name__)
if config is not None:
# Если указан объект конфигурации - переписываем настройки из него
app.config.from_object(config)
# Устанавливаем соединение с базой данных - это ключевой момент
database.db.init_app(app)
# Регистрируем blueprint'ы
app.register_blueprint(main)
app.register_blueprint(auth)
return app
Ну а далее используете это фабрику как Вам будет угодно, например:
if __name__ == "__main__":
app = create_app()
app.run(debug=True)
Это простейший случай, когда blueprint'ы служат только для логической разбивки приложения на удобные куски. Если предполагается, что blueprint'ы будут как полностью независимые приложения, то процедура будет аналогичная, но внутри каждого blueprint'а создается свой объект db и подключается в фабрике к приложению.