За последние месяцы я написал полдюжины маленьких приложений на флягу / sqlalchemy, и, похоже, я продолжу.В основном это независимые инструменты для внутренней сети, которые позволяют просматривать и оценивать данные в различных базах данных компании.У меня есть один проект с логотипом компании, таблицей стилей и некоторыми общими представлениями (вход / выход из системы).Таким образом, типичное приложение следует этому шаблону:
if (production_environment):
engine_1 = create_engine(uri_1)
engine_2 = create_engine(uri_2)
engine_3 = create_engine(uri_3)
else: # offline the intranet
engine_1 = create_engine(devel_server)
# etc.
Session_1 = sessionmaker(...)
Session_2 = sessionmaker(...)
Session_3 = sessionmaker(...)
app = Flask("some_app")
app.register_blueprint(company_layout)
# this is needed for the company blueprint template to display the
# title of the app in the top title bar
app.config['TITLE'] = "Some App"
@app.route('/')
def index():
db1 = Session_1
db2 = Session_2
... you get the gist.
Теперь это много шаблонного кода.Сначала я подумал выделить все эти настройки и настройки базы данных в отдельный модуль с создателями сеансов и функцией, которая будет возвращать полностью настроенное приложение.Но это все еще оставляет мне множество отдельных приложений, которым необходимо предоставить свои собственные точки входа на уровне веб-сервера / wsgi, а также они не могут ссылаться друг на друга на сервере разработки.
Из документации на фляги я понимаю, что способ справиться с этой ситуацией состоит в том, чтобы выделить все маленькие приложения в отдельные чертежи, а затем создать одно централизованно настроенное основное приложение и зарегистрировать все чертежи на нем.Я попробовал, и это работает, как ожидалось.Но есть несколько вещей, которые я либо не могу понять, либо, кажется, понял странным образом «это не так, как это должно работать».
Номер один: я хочу планустановить собственный заголовок для отображения в верхнем шаблоне макета.Прямо сейчас я использую хак config ['TITLE'], чтобы сделать это.Это то, для чего предназначен контекстный процессор?
Номер два: Базы данных.Документы sqlalchemy говорят, что механизмы и создатель сеанса должны устанавливаться один раз вне контекста приложения / запроса и создавать / закрывать сеанс на уровне каждого запроса (как я это делаю сейчас).Похоже, что это противоречит документации по фляге, которая предлагает установить URI базы данных в конфигурации приложения (что элегантно решает различие между производством и разработкой).Однако это означает, что вся инфраструктура базы данных должна быть настроена и разрушена при каждом запросе, потому что все происходит внутри контекста приложения.Затем мне нужно каким-то образом создать все движки и создателей сессий в главном модуле приложения, каким-то образом передать их чертежам и сделать так, чтобы план создавал нужные сеансы.Как я могу это сделать?Каким-то образом использовать объект 'g'?Разве это не вызывает значительных накладных расходов?
В любом случае, как вы видите, я немного застрял на архитектурной стороне своего сайта, и я был бы признателен за любые предложения.Благодарю.
PS: я прочитал фабрику приложений документы в pooco, org, но не смог понять, поможет ли это мне решить мою проблему.Я не использую Flask-SQLAlchemy, потому что не могу сказать, для чего он хорош.Почти вся документация просто повторяет материал проектирования модели базы данных из SQLAlchemy, но не объясняет никаких преимуществ использования Flask-SQLAlchemy по сравнению с ванильным SQLAlchemy с scoped_session.Похоже, что делает большую часть базовой механики SQLalchemy невидимой способами, которые я не понимаю.