データベースキャッシュを使用してDjangoでキャッシュを設定しています。ページがキャッシュされる時間を制御する TIMEOUT と CACHE_MIDDLEWARE_SECONDS の 2 つの設定があります。これら2つの設定の違いは何ですか?
3 に答える
実際、それぞれのドキュメントは違いを適切に説明していません。
最初のオプションCACHES
:は、 Django キャッシュ フレームワークの Cache argumentsTIMEOUT
で導入されました。他に何も指定されていない場合、などの関数で使用されるデフォルトの有効期限です。これについては、後で低レベル キャッシュ API の使用法に記載されています。cache.set()
後者は、 Django キャッシュ フレームワークであるサイトごとのキャッシュCACHE_MIDDLEWARE_SECONDS
で導入されました。したがって、ビューごとに が使用されているかのように、これがすべてのページのデフォルトの有効期限であると想定しても安全です。@cache_page(settings.CACHE_MIDDLEWARE_SECONDS)
同じ質問がありましたが、既存の回答ではまだ解決しませんでした。そこで、ソースコードに飛び込むことにしました。オープンソースをよろしく!
CACHE_MIDDLEWARE_SECONDS
UpdateCacheMiddleware
ミドルウェアによって使用されます。ビューがまだ設定していない場合は ( ) ヘッダーを の値に設定し、クライアント側のキャッシュに影響を与えCache-Control
ますmax-age
。CACHE_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
ます。
代替ミドルウェアCacheMiddleware
もCACHE_MIDDLEWARE_SECONDS
. を使用していない限り、これは影響しませんCacheMiddleware
。
TIMEOUT
では、設定のポイントは何ですか?キャッシュに直接書き込む場合に使用されるデフォルト値だと思いますが、前述のミドルウェアでは使用されません。例えば:
from django.core.cache import cache
cache.set('my_key', 'my_value') # uses TIMEOUT value as default