2012-07-22 67 views
0

我使用Redis作爲後端緩存[1]製作了一些Django項目,但我無法確定Redis服務器會一直處於開啓狀態,然後我試圖使用Redis「if if」它可用使用LocMem等其他後端。如何禁用Django內部函數緩存?

我正在使用的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爲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 

我傳遞時間()只是創造一些分化爲嘗試解決緩存problm。

大的情況是,函數PingBackend()沒有爲每個請求執行,只是首先我無法監視Redis服務器。

謝謝!

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

回答

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只有一個,通過它,你通過調用PingBackend一旦得了一個cache說法。它甚至不僅僅執行第一個請求,它在定義視圖函數時執行一次。

如果應用程序可用,您應該編寫自己的緩存後端,如果不是,則應使用Redis。

+0

非常感謝,我想你說得對,cya! – 2012-07-23 05:07:14