Django - Cambio de base de datos en tiempo de ejecución

En mi trabajo queremos ejecutar un servidor con múltiples bases de datos. El cambio de bases de datos debe ocurrir cuando accede a una URL comohttp://myapp.webpage.com ohttp://other.webpage.com. Queremos ejecutar solo una instancia de servidor y, en el momento de la solicitud HTTP, cambiar la base de datos y devolver la respuesta correspondiente.

Hemos estado buscando una solución sostenible y 'amigable con Django'. En nuestra investigación hemos encontrado posibles formas de hacer esto, pero no tenemos suficiente información al respecto.

Opción 1: middleware Django

El middleware django se ejecuta cada vez que el servidor recibe una solicitud HTTP.

Hacer un cambio de base de datos aquí podría ser la mejor opción, pero usarenrutadores de bases de datos django que yo sepa, solo permite cambiar la base de datos para un modelo o grupo o modelos.

Otra opción es establecer ungerente de modelo django instancia en el middleware y obligar a todos los modelos a reasignar elobjects atributo de un atributo agregado en el middleware personalizado.

Mi última opción es crear un nuevo atributo en el objeto de solicitud recibido por el middleware que devuelve eldatabase alias desettings.py y en cada consulta modelo use elutilizando el método.

Opción 2: Vista Mixin basada en clase

Crea un mixin que use las últimas tres opciones, pero yoel mixin debe establecerse en TODAS las vistas basadas en clase. Si un programador olvida configurar el mixin y se trata de un servidor de producción, los datos podrían estar (o dejar de estar) en la base de datos correcta, y no quiero arriesgarme.

Opción 3: cambiar la configuración de la base de datos en tiempo de ejecución

Esta opción funciona peroNo es recomendado Y es demasiado arriesgado.

ACTUALIZAR:¿Cómo funciona esto?

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

Cualquier información que nos ayude a resolver será muy apreciada.

Respuestas a la pregunta(1)

Su respuesta a la pregunta