如何在启用调试时禁用Django每视图缓存?

时间:2011-02-23 17:17:25

标签: django caching

我在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 个答案:

答案 0 :(得分:12)

结帐django的虚拟缓存后端。 因此,对于您的开发环境,您应该将缓存后端设置为django.core.cache.backends.dummy.DummyCache

答案 1 :(得分:5)

您可以有条件地装饰您的视图。

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

实际上它可以在没有lambda的情况下完成

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

答案 2 :(得分:4)

使用@ 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)

使用此方法,在{Django}启动期间只会定义CACHE_FUNC一次。因此,在开发过程中不会影响性能,也不会产生烦人的Expires标头!