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

Wil*_*hes 3 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')
Run Code Online (Sandbox Code Playgroud)

这非常有效,但在测试期间却很痛苦.我如何只在调试关闭时进行缓存?

zsq*_*are 12

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

  • 这是一个很好的方法,但它仍然会设置“Expires”标头,这在某些开发情况下可能会很烦人。如果您遇到问题,请查看[我的答案](http://stackoverflow.com/a/21062389/1248175) 或[StephenPaulger's](http://stackoverflow.com/a/5094671/1248175)。 (2认同)

Ste*_*ger 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)
Run Code Online (Sandbox Code Playgroud)

也许这会工作。

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')
Run Code Online (Sandbox Code Playgroud)

实际上,可以不用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')
Run Code Online (Sandbox Code Playgroud)