2010-08-12 18 views
5

J'ai modifié le middleware multihost.py que j'ai trouvé au http://effbot.org/zone/django-multihost.htm pour définir les paramètres.SITE_ID de façon dynamique, mais j'ai quelques inquiétudes que je puisse avoir quitté la réservation.Sûr de modifier les paramètres.SITE_ID du middleware dans Django?

La plupart des exemples que j'ai trouvés pour l'hébergement de plusieurs domaines ont été configurés avec plusieurs fichiers settings.py codés en dur sur leur SITE_ID respectif. Est-ce que j'ai créé un correctif avec un défaut fatal ici? Est-ce que changer cette valeur dynamiquement me mord sur le 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) 

Pour les curieux, c'est opérationnel jusqu'à présent, mais n'a pas résisté au trafic réel.

+0

Aucune idée de savoir si cela fonctionnera, mais je me demande si l'utilisation de 'urlparse' serait préférable pour obtenir le nom d'hôte (http://docs.python.org/library/urlparse.html). –

+0

Plus d'informations, ce code a été mis en place sur un site de 2 domaines depuis environ une semaine maintenant sans problèmes apparents. Assez faible trafic mais je pense que le concept tient. –

Répondre

6

La réponse courte et officielle est you're not supposed to do this, bien que les docs n'expliquent pas vraiment pourquoi pas.

Si vous utilisez un serveur à thread, je serais préoccupé par une condition de concurrence. Cela devrait être assez simple à tester; Il suffit de mettre un appel à sleep() dans une vue, puis de retourner un HttpResponse avec le nom du site actuel. Pendant que la première vue est en veille, appuyez sur une vue différente sur un domaine différent.

Si vous utilisez prefork, je n'imagine pas que cela causerait des problèmes. J'ai utilisé cette approche avec matplotlib, car il est plus facile de définir les propriétés du graphe en changeant la configuration globale avec matplotlib.rcParams.update(). J'utilise prefork fcgi, donc je peux sans risque supposer que chaque demande a tout le processus à lui-même (les gens, s'il vous plaît corrigez-moi si je me trompe).

Modifier: Je pense que vous pouvez faire ce que vous voulez en utilisant RequestSite par désactiver l'application sites. Par exemple, le django-registration de James Bennett instancie un objet RequestSite dans ce cas, qui extrait le nom d'hôte de l'objet de requête.