Сценарий
У нас есть два приложения.
TheApp
TheApp - невероятное приложение, которое любят клиенты.Каждый клиент получает свой собственный экземпляр приложения, что означает, что каждый клиент будет использовать свою собственную базу данных (имя, пользователя, пароль).Соединение с базой данных должно определяться для домена, из которого поступает запрос.
req: customerA.foo.tld -> db:(app_cust1, cust1, hunter2)
req: customerB.foo.tld -> db:(app_cust2, cust2, hunter3)
Приложение администрирования
Должно иметь возможность создавать / удалять экземпляры TheApp для клиентов.Поэтому он должен настроить новую базу данных и записать конфигурацию в где-нибудь .Способ, который решает, какой дБ используется для входящего запроса, должен хорошо работать и быть легко управляемым.
Вопрос
Какой наилучший способ решить, какое соединение с базой данных следует использовать для экземпляра?Что выполняет лучше всего?Какие шкалы лучше?
Ответы, которые я придумал ™
Я читаю материал, и вот способы, которыми я придумал:
(wsgi daemon + settings.py) в экземпляр
Каждый клиент получит свой файл settings.py с учетными данными базы данных.Настройки могут наследовать некоторые общие вещи из общего файла настроек.
Для каждого нового файла настроек должен быть запущен новый экземпляр wsgi приложения.Это может плохо масштабироваться, если у нас много клиентов?Создание файлов vhost apache также ужасно.
Использование 'using' & one settings.py
Я мог бы сделать это как
MyModel.objects.using(THE_CURRENT_DB).all()
и установить где-нибудь THE_CURRENT_DB
(промежуточная штучка?) за запрос.Но кажется уродливым делать это везде.Кроме того, settings.py/app необходимо переписывать каждый раз, когда клиент получает свой экземпляр.
Один settings.py + Маршрутизатор приложений
Я еще не видел, могу ли я получить доступ к любомуинформация о запросе в роутере, но если это так, я, возможно, мог бы решить, какой из БД в settings.py следует использовать.Вроде как https://docs.djangoproject.com/en/1.3/topics/db/multi-db/#an-example но не для каждой модели, а для запроса.
Изменение настроек в промежуточном программном обеспечении
Просто пришла в голову мысль, что, возможно, настройку db можно изменить в промежуточном программном обеспечении.Еще не видел, как работает промежуточное программное обеспечение в Django и что там возможно.
Некоторые неясны по-другому
Поскольку я довольно новичок в Django, я мог пропустить некоторые моменты или некоторые изони просто глупы и плохи.Что бы ты сделал?
Почему бы не все в одном дБ?
Хорошо.Потому что я думаю, что разделение вещей хорошо.И если случается что-то плохое, внезапно страдают не все.