Форум сайта python.su
Набросал тестовый “проект” на Flask, с помощью Blueprint разбил на два приложения main и auth, также прикрутил Flask-WTF формы. Проблема возникла только при работе с БД, если инициализировать в главном файле app.py и потом импортировать объект SQLAlchemy в приложение auth возникает ошибка циклического импорта, не могли бы вы подсказать как правильно прикрутить SQLAlchemy?
Спасибо!
Отредактировано zillion (Ноя. 2, 2014 00:24:50)
Офлайн
Не очень понятно, в чем проблема и чего вы пытаетесь достичь. В приведенном коде нет обращений к sqlalchemy, а угадывать, где и что вы инициализируете и куда что импортируете, как-то глупо.
Любые обращения к sqlalchemy нужно вынести в модели (иногда и в менеджеры), они отвечают за работу с orm и базой данных. Остальные модули должны работать именно с ними. По flask довольно много примеров даже на официальном сайте, посмотрите, как что работает.
Отредактировано fata1ex (Авг. 26, 2012 12:50:48)
Офлайн
Насколько я помню Flask, то циклические импорты, при работе с моделями, в нем хорошо лечатся следующим образом:
1. Создаем файл database.py, в котором у нас будет лежать главный объект модели:
from flaskext.sqlalchemy import SQLAlchemy db = SQLAlchemy()
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)
Отредактировано ziro (Авг. 27, 2012 09:49:11)
Офлайн
@ziro спасибо за ответ, уже разобрался, схема вышла почти такая же как у вас.
Офлайн