如何禁用Django内部函数缓存



我正在做一些Django项目,使用Redis作为后端缓存[1],但我不能确定Redis服务器是否会一直打开,然后我尝试使用Redis"如果"它可用,否则使用其他后端,如LocMem等。

我使用的Redis后端[1]是完全兼容的,所以我可以使用Django Decorations。

我想创建一个这样调用的函数:

from django.views.decorators.cache import cache_page
from utils import PingBackend
from time import time
@cache_page(60, cache=PingBackend(time()))
def index(request):
    artigos = Artigo.objects.filter(ativo=1)
    return render_to_response('index.html', {'artigos':artigos}, RequestContext(request))

问题是Django(我猜是内部)缓存PingBackend()的响应并第一次调用它,即使我丢弃了RedisServer Django告诉ping进程成功了。

即使DEBUG=True并且"default"CacheBackend为dummy,也会发生这种情况。

def PingBackend(time):
    print time
    response = None
    try:
        con = StrictRedis(host=settings.REDIS_HOST, port=settings.REDIS_PORT, db=0)
        # Execute some action
        con.ping()
        # If not give an exception, use redis
        response = 'redis'
    except:
        response = 'default' #dummy
    return last_response

我传递时间()只是为了创建一些差异,以尝试解决缓存问题。

重要的是,PingBackend()函数并没有为每个请求执行,只是第一次我无法监控Redis服务器。

谢谢!

[1] -https://github.com/niwibe/django-redis

这与Django内部无关,这与装饰器的工作方式有关。当你这样定义你的观点时:

@cache_page(60, cache=PingBackend(time()))
def index(request):
    blah blah

它完全等同于:

def index(request):
    blah blah
index = cache_page(60, cache=PingBackend(time()))(index)

您只调用了一次cache_page,并将通过调用PingBackend一次获得的cache参数传递给它。它甚至不只是针对第一个请求执行,而是在定义视图函数时执行一次。

如果Redis可用,您应该编写自己的缓存后端,如果不可用,则编写其他缓存后端。

最新更新