2011-02-23 57 views
2

我已经在Django中使用每页缓存写了一堆视图。代码如下所示:如何在调试时禁用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') 

这个奇妙的作品,但在测试过程中有疼痛感。我怎样才能在关闭调试的情况下进行缓存?

回答

10

退房Django的虚拟缓存后端。 因此,对于你的开发环境,你应该缓存后端设置为django.core.cache.backends.dummy.DummyCache

+0

正是我所需要的,谢谢。 – 2011-02-25 11:20:26

+1

这是一个不错的方法,但它仍然会设置'Expires'标头,这在某些开发情况下可能会令人讨厌。如果您在检查[我的答案](http://stackoverflow.com/a/21062389/1248175)或[StephenPaulger's](http://stackoverflow.com/a/5094671/1248175)时遇到问题。 – rednaw 2014-01-11 13:06:07

4

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

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

这意味着将条件检查添加到实现缓存的每个视图。 – zsquare 2011-02-23 17:43:50

+0

我已经添加了一个替代否定此要求。 – 2011-02-23 17:47:21

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) 

然后你就可以代替进口原生Django的一个的这个自定义cache_page功能,并使用同样的方式。这个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头文件!