Django 만료 @cache페이지에 캐시된views 데이터

3385 단어 Django
django의 캐시 시스템에서 cache페이지 이 장식기는 매우 유용합니다. 장식기 하나만 추가하면views의 응답 내용을 캐시할 수 있지만,django는 이views 캐시 데이터를 만료하는 기능을 제공하지 않습니다.
@cache_page(60*10)
def blog_post(request):
    ...

위의 코드는 이 요청 응답체를 10분 동안 캐시하는 것입니다. 만약에 데이터가 2분 동안 캐시되었다면post의 내용이 업데이트되었습니다. 이 현재의 캐시를 만료하려면 어떻게 해야 합니까? sof에 비슷한 질문이 있는데 expire-a-view-cache-in-django입니다. 가장 찬성하는 답안은 새 버전의 Django에 좋지 않습니다. (1.8에서는 사용할 수 없습니다) 다른 답안은 사용할 수 있는 것이 있습니다. 헤헤.
나도 해결 방법을 하나 썼는데, 내 프로젝트에서 사용하는 것은 그런대로 괜찮다.
# coding:utf-8
from __future__ import absolute_import

from django.core.cache import cache
from django.core.urlresolvers import reverse
from django.http import HttpRequest
from django.utils.cache import get_cache_key


def expire_page_cache(view, curreq, args=None, key_prefix=None):
    """
    Removes cache created by cache_page functionality.
    Parameters are used as they are in reverse()
    """

    if args is None:
        path = reverse(view)
    else:
        path = reverse(view, args=args)

    http_host = curreq.META.get("HTTP_HOST", "")
    if len(http_host.split(":")) == 1:
        server_name, server_port = http_host, "80"
    else:
        server_name, server_port = http_host.split(":")

    request = HttpRequest()
    request.META = {'SERVER_NAME': server_name, 'SERVER_PORT': server_port}
    request.META.update(dict((header, value) for (header, value) in
                             curreq.META.items() if header.startswith('HTTP_')))
    request.path = path
    key = get_cache_key(request, key_prefix=key_prefix)
    if key and cache.get(key):
        cache.set(key, None, 0)

사용하기 전에 이 fake의 Request를 어떻게 설정하는지 엄격하게 테스트하고 상황에 따라 개선하십시오.만료 및 key 지원prefix, 캐시 정책에 @vary 포함on_쿠키가 지원되지 않습니다.지금도 지지하고 있습니다.
이 부분의 논리적 소스 코드는 주로 django/middleware/cache.py 파일에서 문제가 있으면 여기 캐시 논리를 참고하십시오.

좋은 웹페이지 즐겨찾기