5

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

我为多域托管找到的大多数示例都是使用硬编码到各自 SITE_ID 的多个 settings.py 文件设置的。

我是否在这里创建了具有致命缺陷的修复程序?将动态更改此值会在 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)

对于好奇的人来说,到目前为止它已经启动并运行,但还没有经受住实际的流量。

4

1 回答 1

6

简短的官方回答是您不应该这样做,尽管文档并没有真正解释为什么不这样做。

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

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

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

于 2011-01-27T20:50:17.587 回答