代码之家  ›  专栏  ›  技术社区  ›  Ryan Townshend

从Django的中间件修改settings.SITE\u ID安全吗?

  •  5
  • Ryan Townshend  · 技术社区  · 15 年前

    我已经修改了在中找到的multihost.py中间件 http://effbot.org/zone/django-multihost.htm 动态设置settings.SITE\u ID,但我担心我可能刚离开预订。

    我发现的多域托管的大多数示例都是用多个settings.py文件硬编码到各自的站点ID来设置的。

    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)
    

    对于好奇的人来说,这是建立和运行到目前为止,但还没有经得起实际流量。

    1 回复  |  直到 15 年前
        1
  •  6
  •   Aryeh Leib Taurog    13 年前

    简而言之,官方的答案是 you're not supposed to do this ,尽管医生没有真正解释为什么不能。

    如果您使用的是线程化服务器,我会担心争用条件。这应该很容易测试;打个电话给 sleep() HttpResponse

    如果你使用prefork,我不认为这会引起任何问题。我在matplotlib中使用了这种方法,因为通过使用 matplotlib.rcParams.update() . 我使用prefork fcgi,所以我可以安全地假设每个请求都有自己的整个过程(各位,如果我错了,请纠正我)。

    编辑 :我认为你可以使用 RequestSite 通过 禁用 这个 sites 应用程序。詹姆斯·班纳特的 django-registration 例如,实例化 RequestSite 对象,从请求对象中提取主机名。

    推荐文章