Django - Troca de banco de dados de tempo de execução

No meu trabalho, queremos executar um servidor com vários bancos de dados. A alternância de bancos de dados deve ocorrer quando você acessa um URL comohttp://myapp.webpage.com ouhttp://other.webpage.com. Queremos executar apenas uma instância do servidor e, no momento da solicitação HTTP, alternar o banco de dados e retornar a resposta correspondente.

Estamos procurando uma solução sustentável e 'amigável ao Django'. Em nossa investigação, encontramos maneiras possíveis de fazer isso, mas não temos informações suficientes.

Opção 1: Middleware Django

O middleware django é executado sempre que o servidor recebe uma solicitação HTTP.

Fazer uma troca de banco de dados aqui pode ser a melhor opção, mas usarroteadores de banco de dados django tanto quanto sei, só permite alterar o banco de dados para um modelo ou grupo ou modelos.

Outra opção é definir umgerente de modelo do django instância no middleware e forçar todos os modelos a atribuir novamente oobjects atributo de um atributo adicionado no middleware customizado.

Minha última opção é criar um novo atributo no objeto de solicitação recebido pelo middleware que retorna odatabase alias desettings.py e em cada consulta de modelo use ousando o método.

Opção 2: View Mixin baseado em classe

Crie um mixin que use as três opções anteriores, mas euo mixin deve ser definido em TODAS as visualizações baseadas em classe. Se um programador esquecer de configurar o mixin e ele chegar a um servidor de produção, os dados poderão estar (ou deixar de estar) no banco de dados correto, e eu não quero correr o risco.

Opção 3: Alterando as Configurações do Banco de Dados em Tempo de Execução

Esta opção funciona masNão é recomendado e é muito arriscado.

ATUALIZAR:Como isso funciona?

middlewares.py

import django.conf as conf
import os.path


class SelectDB(object):

    def process_request(self, request):
        print request.META['HTTP_REFERER']
        file_database = open("booklog/database.txt", "r")
        database = file_database.read(10)
        file_database.close()
        if database != 'default':
            conf.settings.DATABASES['default']['NAME'] = database

Qualquer informação que nos ajude a resolver será muito apreciada.

questionAnswers(1)

yourAnswerToTheQuestion