2010-08-12 13 views
5

He modificado el middleware multihost.py que encontré en http://effbot.org/zone/django-multihost.htm para establecer las configuraciones.SITE_ID dinámicamente, pero tengo algunas preocupaciones de que puedo haber dejado la reserva.Seguro para modificar configuraciones.SITE_ID de middleware en Django?

La mayoría de los ejemplos que he encontrado para múltiples dominios se han configurado con múltiples archivos settings.py codificados en sus respectivos SITE_ID.

¿He creado una solución con un error fatal aquí? Va a cambiar este valor mordiéndome dinámicamente en el a **.

from django.conf import settings 
from django.contrib.sites.models import Site 

class MultiHostMiddleware: 

    def process_request(self, request): 
     try: 
      host_raw = request.META["HTTP_HOST"] 
      colon = host_raw.find(':') 
      if colon > -1: 
       host = host_raw[0:colon] 
      else: 
       host = host_raw 

      s = Site.objects.get(domain=host) 
      if s: 
       settings.SITE_ID = s.id 

     except KeyError: 
      pass # use default urlconf (settings.ROOT_URLCONF) 

Para los curiosos esto está funcionando hasta el momento, pero no se ha resistido al tráfico real.

+0

No tengo idea si eso funcionará, pero me pregunto si usar 'urlparse' sería mejor para obtener el nombre de host (http://docs.python.org/library/urlparse.html). –

+0

Información adicional, este código ha estado en su lugar en un sitio de 2 dominios durante aproximadamente una semana sin fallas técnicas aparentes. El tráfico es bastante bajo, pero creo que el concepto es válido. –

Respuesta

6

La respuesta oficial corta es you're not supposed to do this, aunque los documentos no explican realmente por qué no.

Si está utilizando un servidor enhebrado, me preocuparía una condición de carrera. Esto debería ser bastante simple de probar; simplemente haga una llamada al sleep() en una vista, luego regrese un HttpResponse con el nombre del sitio actual. Mientras la primera vista está durmiendo, presione una vista diferente en un dominio diferente.

Si utiliza prefork, no creo que esto pueda causar ningún problema. He usado este enfoque con matplotlib, ya que es más fácil establecer las propiedades del gráfico cambiando la configuración global con matplotlib.rcParams.update(). Utilizo prefork fcgi, por lo que puedo suponer con seguridad que cada solicitud tiene todo el proceso para sí mismo (amigos, corríjanme si me equivoco).

Editar: creo que se puede hacer lo que desee con RequestSite por deshabilitar la aplicación sites. Por ejemplo, el django-registration de James Bennett crea una instancia de un objeto RequestSite en ese caso, que extrae el nombre de host del objeto de solicitud.

Cuestiones relacionadas