0

Redis をバックエンド キャッシュ [1] として使用して Django プロジェクトをいくつか作成していますが、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() がリクエストごとに実行されていないことです。最初の 1 つだけで、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)

1 回だけ呼び出して、1 回呼び出して取得した引数をcache_page渡します。最初のリクエストだけでなく、ビュー関数が定義されたときに一度実行されます。cachePingBackend

利用可能な場合は Redis を使用する独自のキャッシュ バックエンドを作成する必要があり、利用できない場合は別のものを作成する必要があります。

于 2012-07-22T11:46:09.503 に答える