Безопасно изменять настройки. SITE_ID из промежуточного программного обеспечения в Django? - PullRequest
5 голосов
/ 12 августа 2010

Я изменил промежуточное программное обеспечение multihost.py, которое я нашел в http://effbot.org/zone/django-multihost.htm, чтобы динамически установить settings.SITE_ID, но есть некоторые опасения, что я, возможно, только что оставил резервирование.

Большинство примеров IНайдено, что для хостинга нескольких доменов были настроены несколько файлов 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)

Для любопытных это работает и работает до сих пор, но не выдержал фактический трафик.

1 Ответ

6 голосов
/ 27 января 2011

Короткий официальный ответ: Вы не должны делать это , хотя документы не объясняют, почему нет.

Если вы используете многопоточный сервер, меня беспокоит состояние гонки. Это должно быть довольно просто проверить; просто вызовите sleep() в одном представлении, а затем верните HttpResponse с именем текущего сайта. Пока первое представление спит, нажмите другое представление в другом домене.

Если вы используете prefork, я не думаю, что это вызовет какие-либо проблемы. Я использовал этот подход с matplotlib, поскольку проще всего установить свойства графа, изменив глобальную конфигурацию с помощью matplotlib.rcParams.update(). Я использую prefork fcgi, поэтому могу смело предположить, что каждый запрос имеет весь процесс (ребята, пожалуйста, исправьте меня, если я ошибаюсь).

Редактировать : Я думаю, что вы можете делать то, что вы хотите, используя RequestSite , отключая приложение sites. Например, django-registration Джеймса Беннетта создает в этом случае объект RequestSite, который извлекает имя хоста из объекта запроса.

...