Django предотвращает кэширование, если пользователь вошел в систему

Мои посетители получают кешированную версию страницы от Varnish. Я хотел бы, чтобы пользователь-администратор всегда видел текущую версию страницы. Таким образом, все изменения сразу видны.

Что-то подобное существует? Я знаю о декораторе @never_cache. Я ищу что-то подобное, только если пользователь не вошел в систему.

Бонусные баллы, если он работает с Django-CMS!


person vdboor    schedule 06.09.2011    source источник
comment
Конечно, это вопрос Varnish, а не Django?   -  person Daniel Roseman    schedule 06.09.2011


Ответы (3)


Я предположил, что вы используете декораторы кеша. Приведенный ниже код представляет собой декоратор, который возвращает представление, украшенное другим декоратором (например, cache_page), только если пользователь не является администратором. Таким образом, администратор всегда будет получать не оформленную (не кэшированную) страницу, а другие пользователи получат оформленную (возможно, кэшированную) страницу. Он работает со всеми возможными декораторами (не только с cache_page).

def conditional_cache(decorator):
    """ Returns decorated view if user is not admin. Un-decorated otherwise """

    def _decorator(view):

        decorated_view = decorator(view)  # This holds the view with cache decorator

        def _view(request, *args, **kwargs):

            if request.user.is_staff:     # If user is staff
                return view(request, *args, **kwargs)  # view without @cache
            else:
                return decorated_view(request, *args, **kwargs) # view with @cache

        return _view

    return _decorator

Чтобы использовать его вместо типичного синтаксиса:

@cache_page(123)
def testview(request):
    (...)

использовать:

@conditional_cache(decorator=cache_page(123))  # The argument is what you usually do with views, but without the @
def testview(request):
    (...)
person Mariusz Jamro    schedule 21.02.2012
comment
Хорошо работает для меня! Спасибо - person Martin Krung; 19.01.2016

Я узнал, что есть что-то вроде:

CACHE_MIDDLEWARE_ANONYMOUS_ONLY = True

Это должно работать для большинства веб-сайтов, если нет различия между пользователями и сотрудниками.

Чтобы явно отправить заголовок Cache-Control для сотрудников, можно написать некоторое промежуточное программное обеспечение (которое также, к сожалению, зависит от заголовка Cookie).

person vdboor    schedule 22.02.2012
comment
Эта опция устарела и удалена в текущих версиях Django. - person Simon Steinberger; 29.10.2014

CACHE_MIDDLEWARE_ANONYMOUS_ONLY удален в Django 1.8

Вместо этого можно использовать вариантные заголовки и многое другое. в частности декоратор vary_on_cookie.

Это означает, что отдельный кеш хранится в соответствии с файлом cookie каждого пользователя.

Вошедшие в систему пользователи имеют файл cookie, в отличие от незарегистрированных пользователей, и поэтому для каждого сеанса файлов cookie создаются разные кеши. Далее следует моя реализация.

urls.py запись:

from django.views.decorators.vary import vary_on_cookie
from django.views.decorators.cache import cache_page

...
    url(
            r'^$',
            cache_page(60 * 1440, cache='disk')(vary_on_cookie(MyCbvView.as_view())),
            name='view-name',
        ),
...
person raratiru    schedule 19.01.2017