Найти - Пользователи
Полная версия: Flask + Blueprint + SQLAlchemy
Начало » Web » Flask + Blueprint + SQLAlchemy
1
zillion
Набросал тестовый “проект” на Flask, с помощью Blueprint разбил на два приложения main и auth, также прикрутил Flask-WTF формы. Проблема возникла только при работе с БД, если инициализировать в главном файле app.py и потом импортировать объект SQLAlchemy в приложение auth возникает ошибка циклического импорта, не могли бы вы подсказать как правильно прикрутить SQLAlchemy?

Спасибо!
fata1ex
Не очень понятно, в чем проблема и чего вы пытаетесь достичь. В приведенном коде нет обращений к sqlalchemy, а угадывать, где и что вы инициализируете и куда что импортируете, как-то глупо.

Любые обращения к sqlalchemy нужно вынести в модели (иногда и в менеджеры), они отвечают за работу с orm и базой данных. Остальные модули должны работать именно с ними. По flask довольно много примеров даже на официальном сайте, посмотрите, как что работает.
ziro
Насколько я помню 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 и подключается в фабрике к приложению.
zillion
@ziro спасибо за ответ, уже разобрался, схема вышла почти такая же как у вас.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB