Срок действия кеша просмотра в Django? - PullRequest
42 голосов
/ 15 февраля 2010

@cache_page decorator потрясающий. Но для моего блога я хотел бы сохранить страницу в кеше, пока кто-то не прокомментирует сообщение. Это звучит как отличная идея, так как люди редко комментируют, поэтому хранить страницы в memcached, пока никто не комментирует, было бы замечательно. Я думаю, что кто-то должен был иметь эту проблему раньше? И это отличается от кэширования на URL.

Итак, решение, о котором я думаю, это:

@cache_page( 60 * 15, "blog" );
def blog( request ) ...

И тогда я бы сохранил список всех ключей кеша, используемых для просмотра блога, и затем мог бы исчерпать пространство кеша блога. Но я не очень опытен с Django, поэтому мне интересно, знает ли кто-нибудь лучший способ сделать это?

Ответы [ 15 ]

0 голосов
/ 07 августа 2018

Теперь все проще (проверено на Django 1.10)

from django.db.models.signals import post_save
from django.core.cache import cache
from django.dispatch import receiver

@receiver(post_save)
def clear_the_cache(**kwargs):
    cache.clear()
0 голосов
/ 16 июня 2018

Еще одна обновленная версия ответа Дункана: пришлось выяснить правильные мета-поля: (проверено на Django 1.9.8)

def invalidate_cache(path=''):
    import socket
    from django.core.cache import cache
    from django.http import HttpRequest
    from django.utils.cache import get_cache_key

    request = HttpRequest()
    domain = 'www.yourdomain.com'
    request.META = {'SERVER_NAME': socket.gethostname(), 'SERVER_PORT':8000, "HTTP_HOST": domain, 'HTTP_ACCEPT_ENCODING': 'gzip, deflate, br'}
    request.LANGUAGE_CODE = 'en-us'
    request.path = path

    try:
        cache_key = get_cache_key(request)
        if cache_key :
            if cache.has_key(cache_key):
                cache.delete(cache_key)
                return (True, 'successfully invalidated')
            else:
                return (False, 'cache_key does not exist in cache')
        else:
            raise ValueError('failed to create cache_key')
    except (ValueError, Exception) as e:            
        return (False, e)
0 голосов
/ 01 мая 2018

Я боролся с подобной ситуацией, и вот решение, которое я нашел, я запустил его на более ранней версии Django, но в настоящее время оно используется на версии 2.0.3.

Первая проблема: когда вы устанавливаете объекты для кэширования в Django, он устанавливает заголовки так, чтобы последующие кэши, включая кэш браузера, кэшировали вашу страницу.

Чтобы переопределить это, вам нужно установить промежуточное ПО. Я взломал это из других источников на StackOverflow, но пока не могу его найти. В appname/middleware.py:

from django.utils.cache import add_never_cache_headers


class Disable(object):

    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        response = self.get_response(request)
        add_never_cache_headers(response)
        return response

Затем в settings.py, к MIDDLEWARE, добавить:

'appname.middleware.downstream_caching.Disable',

Имейте в виду, что этот подход полностью отключает последующее кэширование, что может не соответствовать вашим ожиданиям.

Наконец, я добавил к своему views.py:

def expire_page(request, path=None, query_string=None, method='GET'):
    """
    :param request: "real" request, or at least one providing the same scheme, host, and port as what you want to expire
    :param path: The path you want to expire, if not the path on the request
    :param query_string: The query string you want to expire, as opposed to the path on the request
    :param method: the HTTP method for the page, if not GET
    :return: None
    """
    if query_string is not None:
        request.META['QUERY_STRING'] = query_string
    if path is not None:
        request.path = path
    request.method = method

    # get_raw_uri and method show, as of this writing, everything used in the cache key
    # print('req uri: {} method: {}'.format(request.get_raw_uri(), request.method))
    key = get_cache_key(request)
    if key in cache:
        cache.delete(key)

Мне не нравилось передавать объект request, но на момент написания он предоставляет схему / протокол, хост и порт для запроса, почти любой объект запроса для вашего сайта / приложения будет делать, пока вы передаете путь и строку запроса.

0 голосов
/ 17 мая 2016

Ответ Дункана хорошо работает с Django 1.9. Но если нам нужно сделать недействительным URL с GET-параметром, мы должны внести небольшие изменения в запрос. Например, для ... /? Mykey = myvalue

request.META = {'SERVER_NAME':'127.0.0.1','SERVER_PORT':8000, 'REQUEST_METHOD':'GET', 'QUERY_STRING': 'mykey=myvalue'}
request.GET.__setitem__(key='mykey', value='myvalue')
0 голосов
/ 30 апреля 2016

Решение простое и не требует дополнительной работы.

Пример

@cache_page(60 * 10)
def our_team(request, sorting=None):
    ...

Это установит ответ на кеш с ключом по умолчанию.

Срок действия кеша просмотра

from django.utils.cache import get_cache_key
from django.core.cache import cache

# This will remove the cache value and set it to None
cache.set(get_cache_key(request), None)

Простой, Чистый, Быстрый.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...