2010-08-12 45 views
5

我修改了我在http://effbot.org/zone/django-multihost.htm找到的multihost.py中间件来动态设置设置.SITE_ID,但有一些担心,我可能刚刚离开了预留。从Django的中间件安全地修改设置.SITE_ID?

我发现多个域托管的大多数示例都已经设置了多个settings.py文件,并将其硬编码为各自的SITE_ID。

我是否在这里创建了一个致命的缺陷修复程序?动态地改变这个值会让我对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) 

由于好奇,这是运行到目前为止,但还没有站起来的实际交通。

+0

不知道这是否可行,但我想知道是否使用'urlparse'会更好地获取主机名(http://docs.python.org/library/urlparse.html)。 – 2010-08-12 08:08:36

+0

其他信息,这段代码已经在2个域名站点上存在了大约一个星期,现在没有明显的故障。交通相当低,但我认为这个概念是成立的。 – 2010-08-16 17:47:57

回答

6

简短的官方回答是you're not supposed to do this,尽管文档没有真正解释为什么不能。

如果您使用的是线程服务器,我会担心竞争条件。这应该是相当简单的测试;只需在一个视图中拨打sleep(),然后返回带有当前网站名称的HttpResponse。在第一个视图处于睡眠状态时,在不同的域上点击不同的视图。

如果您使用prefork,我不认为这会造成任何问题。我在matplotlib中使用了这种方法,因为通过使用matplotlib.rcParams.update()更改全局配置来设置图形属性是最容易的。我使用prefork fcgi,所以我可以安全地假设每个请求都有自己的整个过程(伙计们,如果我错了,请纠正我)。

编辑:我想你可以通过禁用sites应用程序做你想要使用的是什么RequestSite。例如,James Bennett的django-registration在这种情况下实例化了一个RequestSite对象,该对象从请求对象中提取主机名。