представления django-mobile отображаются на рабочем столе и наоборот при использовании кэширования

У меня есть проект с Django CMS и django-mobile для рендеринга различных шаблонов для мобильных устройств.

Если кэширование страниц включено в Django CMS, можно увидеть полный мобильный шаблон, отображаемый в настольном браузере, или наоборот; рабочий стол на мобильном.

Из некоторых документов Google я полагал, что решение этой проблемы заключается в настройке промежуточного программного обеспечения для patch_vary_headers;

from django.utils.cache import patch_vary_headers


class VaryHeaderMiddleware(object):
    def process_response(self, request, response):
        # Set Vary Header based on
        # https://developers.google.com/webmasters/smartphone-sites/details

        patch_vary_headers(response, ['User-Agent'])

        return response

С отключенным CMS_PAGE_CACHE я не видел, чтобы полные шаблоны страниц отображались на неправильных устройствах, но у меня есть страница, которая отображается с помощью шаблона рабочего стола, но затем приложения, отображаемые на странице через заполнители CMS, отображают свой мобильный шаблон на рабочий стол. И это при том, что CMS_PLACEHOLDER_CACHE и CMS_PLUGIN_CACHE все еще включены.

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

Я использую последнюю версию django-mobile 0.5.0 и считаю, что все классы промежуточного программного обеспечения определены в правильном порядке;

    'project.middleware.VaryHeaderMiddleware',
    'django_mobile.middleware.MobileDetectionMiddleware',
    'django_mobile.middleware.SetFlavourMiddleware',
    'django_mobile.cache.middleware.CacheFlavourMiddleware',
    'django.middleware.cache.FetchFromCacheMiddleware',
)

person markwalker_    schedule 28.05.2015    source источник


Ответы (1)


Если CMS_PAGE_CACHE не может отличить мобильные устройства от настольных, его можно отключить и заменить кэшированием фрагментов шаблона, см. документы.

Самый простой способ - запустить базовый шаблон, например.

{% load cache %}
{% cache 500 the_whole_page %}

и закончить его с

{% endcache %}

Я не проверял, но должно работать.

person Philipp Zedler    schedule 04.06.2015