我正在使用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服务器。
谢谢!
答案 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,如果不可用,则应该使用其他东西。