我在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')
这非常有效,但在测试过程中却很痛苦。我如何只在调试关闭时进行缓存?
答案 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
标头!