Как отключить кеширование Django для просмотра при включенной отладке? - PullRequest
3 голосов
/ 23 февраля 2011

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

from django.http import HttpResponse
from django.views.decorators.cache import cache_page

@cache_page(60 * 5)
def view_page(request):
    return HttpResponse('hello world')

Это прекрасно работает, но при тестировании это боль.Как сделать кэширование только с отключенной отладкой?

Ответы [ 3 ]

12 голосов
/ 23 февраля 2011

Проверьте бэкэнд для кеша django. Так что для вашей среды разработки вы должны установить бэкэнд кеша на django.core.cache.backends.dummy.DummyCache

5 голосов
/ 23 февраля 2011

Вы можете условно украсить свой вид.

from django.http import HttpResponse
from django.views.decorators.cache import cache_page
from django.conf import settings

def view_page(request):
    return HttpResponse('hello world')
if not settings.DEBUG:
    view_page = cache_page(60 * 5)(view_page)

или, возможно, это сработает.

from django.http import HttpResponse
from django.views.decorators.cache import cache_page, never_cache
from django.conf import settings

production_cache = lambda func: cache_page(60 * 5)(func) if settings.DEBUG else never_cache(func)

@production_cache
def view_page(request):
    return HttpResponse('hello world')

На самом деле это можно сделать без лямбды

from django.http import HttpResponse
from django.views.decorators.cache import cache_page, never_cache
from django.conf import settings

production_cache = cache_page(60 * 5) if not settings.DEBUG else never_cache

@production_cache
def view_page(request):
    return HttpResponse('hello world')
4 голосов
/ 11 января 2014

Используя метод @ StephenPaulger, он также не позволит Django установить заголовки, связанные с кэшем, такие как Expires. Если вы работаете с другой системой, которая интерпретирует эти заголовки и хранит свой собственный кэш, пока дата в заголовке Expires не достигнута, это может быть довольно раздражающим при разработке.

Если вы используете never_cache, Django установит заголовок Expires на текущее время запроса, поэтому документ сразу устареет.

Вы можете создать это в отдельном файле в вашем проекте:

from django.conf import settings
from django.views.decorators.cache import (
    cache_page as django_cache_page, never_cache
)


if settings.DEBUG:
    cache_func = lambda seconds: never_cache
else:
    cache_func = django_cache_page

def cache_page(seconds):
    return cache_func(seconds)

Затем вы можете импортировать эту пользовательскую функцию cache_page вместо встроенной функции Django и использовать ее таким же образом. Этот оператор if будет выполнен только один раз при импорте модуля.

Если у вас есть отдельные файлы настроек (для разработки и производства), вы даже можете сделать это более эффективным, поместив функции в файлы настроек. Поэтому для настроек разработки вы должны сделать это:

from django.views.decorators.cache import never_cache

CACHE_FUNC = lambda seconds: never_cache

А в настройках производства вы бы поставили:

from django.views.decorators.cache import cache_page

CACHE_FUNC = cache_page

Затем в отдельном файле в вашем проекте:

from django.conf import settings

def cache_page(seconds):
    return settings.CACHE_FUNC(seconds)

При использовании этого метода CACHE_FUNC будет определен только один раз при запуске Django. Так что никакого влияния на производительность и никаких раздражающих Expires заголовков во время разработки не будет!

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