我正在做一些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可用,您应该编写自己的缓存后端,如果不可用,则编写其他缓存后端。