2009-04-21 2 views
2

Я использую поддоменов в Джанго для страниц пользователей через промежуточного слоя взломать аналогично тому, что описано here:кэширования Django для субдоменов

Теперь у меня есть кэш Джанго по умолчанию включен для все страницы для не зарегистрированных пользователей. Мне пришлось отключить кеш неявно для пользовательских страниц, поскольку он обрабатывал эти страницы так же, как если бы они были/страницами, например. filmaster.com и michuk.filmaster.com - та же самая страница для django.

Знаете ли вы, какой хороший и простой способ заставить джанго понять субдомены для кеширования? Или вы предлагаете я просто кэшировать каждый из видов поддоменов явно?

Обновление: на самом деле было изучено, что solution, и это не совсем так, как мы это делаем. Мы не перенаправляем. Мы хотим, чтобы URL-адрес оставался в субдомене, поэтому мы просто вызываем представления непосредственно из промежуточного программного обеспечения.

Вы можете увидеть детали Hacky реализации здесь: musielak.eu/public/film20/film20/core/middleware.py [Update: 404 страница не найдена] (пользователь: justlookingaround, передать: фильм @ СТЕРЕО - да, мы с открытым исходным кодом). И вот джира для исправления взлома: jira.filmaster.org/browse/FLM-54 (но это не совсем относится к проблеме - просто убедитесь, что вы не думаете, что мы поддерживаем дрянное кодирование: P)

ответ

0

ОК, вот исправление, которое мы на самом деле используемся , К сожалению, это связано с взломом кода Django, в частности метода _generate_cache_header_key в django/trunk/django/utils/cache.py Что мы делаем, просто проверьте, есть ли какой-либо субдомен в хосте HTTP, и если да, извлеките из него поддомен и добавьте его в кэш-ключ. Мы могли бы просто добавить хост, который будет работать очень то же самое, но взять еще несколько драгоценных бит в ОЗУ.

Это джира: http://jira.filmaster.org/browse/FLM-84 И вот этот код. Используйте на свой риск!

def _generate_cache_header_key(key_prefix, request): 
    """ 
     Returns a cache key for the header cache. 
     With Filmaster hack for handling subdomain caching: http://jira.filmaster.org/browse/FLM-84 
    """ 
    subdomain = None 
    path = request.path 

    # TODO: this is not a decent implementation, it will work only on domains with one dot it them 
    # To fix it, we'd need to pass a param to the request object before CacheMiddleware 
    # this current domain name in it, and use that domain name in the regexp below 
    m = re.match(r"([^\.]+)\.[^\.]+\.[^\.]+", request.META['HTTP_HOST']) 
    if m!=None: 
     subdomain = m.group(1) 

    if subdomain != None: 
     path = subdomain + "___" + path 
    path = md5_constructor(iri_to_uri(path)) 
    return 'views.decorators.cache.cache_header.%s.%s' % (key_prefix, path.hexdigest()) 
0

К сожалению, я не могу решить вашу основную проблему (кэширование поддоменов), кроме как сказать, что все, что я прочитал, подразумевает, что Django не может справиться с этим каким-либо изящным образом. Возможно, это изменилось для версии 1.1, но если это так, я ничего не понял. В моем конкретном приложении я не могу кэшировать субдомены в любом случае, поэтому я не изучил, какие внутренние модификации могут потребоваться для улучшения этой работы.

Однако в отношении способа доступа с видом субдомен, другой вариант, вы могли бы рассмотреть что-то вроде этого:

class SubdomainMiddleware: 
    """ 
    Make the company specified by the subdomain available to views for 
    appropriate processing. 
    """ 
    def process_request(self, request): 
     """ 
     Populate a company attribute on the request object with the company 
     indicated by the requested subdomain. 
     """ 
     domain_parts = request.get_host().split('.') 

     if (len(domain_parts) > 2): 
      subdomain = domain_parts[0] 

      if (subdomain.lower() == 'www'): 
       subdomain = '' 
     else: 
      subdomain = '' 

     if subdomain != '': 
      try: 
       request.company = Company.objects.get(subdomain=subdomain) 
      except Company.DoesNotExist: 
       return HttpResponseRedirect(''.join(['http://test.com', reverse('findcompany')]))     
     else: 
      request.company = None 

Я думаю, что это само за себя - это сильно модифицированная версия что-то я найдено по djangosnippets. Он просто разбирает субдомен, просматривает его в таблице компании, и если это действительная компания, он добавляется к объекту запроса для обработки по представлению. Таким образом, если test.com/test и sub.test.com/test являются действительными, то представление может содержать эту логику, а не толкать ее в промежуточное ПО. Кроме того, поддомены мусора легко передаются поисковому URL.

я намеревался сравнить это с вашим промежуточным слоем (больше для моего собственного образования, чем все остальное), но URL вы указали для вашего кода возвращает 404.

+0

Адрес: ssl: https: // musielak.eu/public/film20/film20 - я не мог предоставить полные URL-адреса до того, как был новичком в StackOverflow :) Он использует очень похожую логику с той, которую вы предоставили на самом деле, за исключением того, что происходит более неприятный материал после обнаружение субдомена. Нам определенно нужно переписать это дерьмо и применить некоторые правильные urls.py для поддоменов. BTW, Filmaster - проект с открытым исходным кодом, и вы (как и все остальные) приглашены присоединиться. Вы можете прочитать больше на http://filmaster.org – michuk

Смежные вопросы