如何禁用Django Internal函数缓存?

时间:2012-07-22 11:38:40

标签: python django caching runtime redis

我正在使用Redis作为Backend Cache [1]制作一些Django项目,但我无法确定Redis服务器是否会一直打开,然后我尝试使用Redis“if”它可用否则使用像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(Internals我猜)缓存PingBackend()的响应并且第一次调用它,即使我放弃RedisServer Django告诉ping过程成功。

即使使用DEBUG = True和'默认'CacheBackend为虚拟,也会发生这种情况。

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

1 个答案:

答案 0 :(得分:3)

这不是关于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,通过调用cache一次传递PingBackend参数。它甚至不是仅针对第一个请求执行,而是在定义视图函数时执行一次。

你应该编写自己的缓存后端,如果它可用则使用Redis,如果不可用,则应该使用其他东西。