Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 25, 2012 14:38:44

zillion
Зарегистрирован: 2012-08-24
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Flask + Blueprint + SQLAlchemy

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

Спасибо!

Отредактировано zillion (Ноя. 2, 2014 00:24:50)

Офлайн

#2 Авг. 26, 2012 12:50:11

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Flask + Blueprint + SQLAlchemy

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

Любые обращения к sqlalchemy нужно вынести в модели (иногда и в менеджеры), они отвечают за работу с orm и базой данных. Остальные модули должны работать именно с ними. По flask довольно много примеров даже на официальном сайте, посмотрите, как что работает.



Отредактировано fata1ex (Авг. 26, 2012 12:50:48)

Офлайн

#3 Авг. 27, 2012 09:44:40

ziro
От:
Зарегистрирован: 2009-08-13
Сообщения: 225
Репутация: +  8  -
Профиль   Отправить e-mail  

Flask + Blueprint + SQLAlchemy

Насколько я помню 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 и подключается в фабрике к приложению.



Отредактировано ziro (Авг. 27, 2012 09:49:11)

Офлайн

#4 Авг. 27, 2012 10:43:25

zillion
Зарегистрирован: 2012-08-24
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Flask + Blueprint + SQLAlchemy

@ziro спасибо за ответ, уже разобрался, схема вышла почти такая же как у вас.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version