0

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

我使用的 Redis 后端 [1] 完全兼容,因此我可以使用 Django 装饰。

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

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 为虚拟,它也会发生。

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

我传递 time() 只是为了创建一些差异化作为尝试解决缓存问题。

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

谢谢!

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

4

1 回答 1

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 可用,您应该编写自己的缓存后端,如果不可用,则使用其他东西。

于 2012-07-22T11:46:09.503 回答