繁体   English   中英

如何禁用Django内部函数缓存?

[英]How to disable Django Internal function cache?

我正在使用Redis作为后端缓存[1]来进行一些Django项目,但是我无法确定Redis Server始终处于打开状态,那么我尝试使用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))

问题是,即使我删除了RedisServer,Django(我想是内部的)也缓存了PingBackend()的响应并仅在第一次调用它,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

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

大局是,函数PingBackend()不会为每个请求执行,只是第一次,我无法监视Redis Server。

谢谢!

[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的缓存后端,如果可用,则使用Redis。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM