Django запретит кеширование, если пользователь залогинен - PullRequest
4 голосов
/ 06 сентября 2011

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

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

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

Ответы [ 3 ]

8 голосов
/ 21 февраля 2012

Я предположил, что вы используете декораторы кеша. Приведенный ниже код представляет собой декоратор, который возвращает представление, оформленное другим декоратором (т. Е. 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):
    (...)
1 голос
/ 22 февраля 2012

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

CACHE_MIDDLEWARE_ANONYMOUS_ONLY = True

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

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

0 голосов
/ 20 января 2017

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',
        ),
...
...