12

データベースキャッシュを使用してDjangoでキャッシュを設定しています。ページがキャッシュされる時間を制御する TIMEOUT と CACHE_MIDDLEWARE_SECONDS の 2 つの設定があります。これら2つの設定の違いは何ですか?

4

3 に答える 3

9

実際、それぞれのドキュメントは違いを適切に説明していません。

最初のオプションCACHES:は、 Django キャッシュ フレームワークの Cache argumentsTIMEOUTで導入されました。他に何も指定されていない場合、などの関数で使用されるデフォルトの有効期限です。これについては、後で低レベル キャッシュ API の使用法に記載されています。cache.set()

後者は、 Django キャッシュ フレームワークであるサイトごとのキャッシュCACHE_MIDDLEWARE_SECONDSで導入されました。したがって、ビューごとに が使用されているかのように、これがすべてのページのデフォルトの有効期限であると想定しても安全です。@cache_page(settings.CACHE_MIDDLEWARE_SECONDS)

于 2015-06-16T10:16:39.630 に答える
7

同じ質問がありましたが、既存の回答ではまだ解決しませんでした。そこで、ソースコードに飛び込むことにしました。オープンソースをよろしく!

CACHE_MIDDLEWARE_SECONDSUpdateCacheMiddlewareミドルウェアによって使用されます。ビューがまだ設定していない場合は ( ) ヘッダーを の値に設定し、クライアント側のキャッシュに影響を与えCache-Controlますmax-ageCACHE_MIDDLEWARE_SECONDSコードは次のとおりです。

    self.cache_timeout = settings.CACHE_MIDDLEWARE_SECONDS
    # ...
    timeout = get_max_age(response)
    if timeout is None:
        timeout = self.cache_timeout
    patch_response_headers(response, timeout)

(これを読みやすくするために、いくつかのコードとエッジコーナーを切り取っていることに注意してください。もちろん、完全なソースコードを自分で読むことができます。)

また、サーバー側のキャッシュに応答を保存し、設定されている場合は設定MIDDLEWARE_CACHE_SECONDSをオーバーライドして、から発生したのと同じタイムアウト値を使用します: ( context )TIMEOUT

    if timeout:
        cache_key = learn_cache_key(request, response, timeout, self.key_prefix, cache=self.cache)
        self.cache.set(cache_key, response, timeout) 

ミドルウェアFetchFromCacheMiddlewareは と共にUpdateCacheMiddleware使用され、後者によって設定されたサーバー側のキャッシュ値を使用するため、 によって間接的に影響を受けCACHE_MIDDLEWARE_SECONDSます。

代替ミドルウェアCacheMiddlewareCACHE_MIDDLEWARE_SECONDS. を使用していない限り、これは影響しませんCacheMiddleware

TIMEOUTでは、設定のポイントは何ですか?キャッシュに直接書き込む場合に使用されるデフォルト値だと思いますが、前述のミドルウェアでは使用されません。例えば:

from django.core.cache import cache
cache.set('my_key', 'my_value') # uses TIMEOUT value as default
于 2016-07-08T10:16:01.527 に答える