nginx サーバー上の uWSGI プロセスによって提供される Django アプリケーションがあります。このアプリケーションは、API 管理に Tastypie を使用し、いくつかのテンプレート ブロックをキャッシュするために memcached を使用します。
私の問題は、API リクエストが古い結果を返し続けることです。
クエリを日付でフィルタリングしています
queryset = Event.objects.filter(status='P').exclude(date_end__lt=date.today()).order_by('-featured', 'date_end')
しかし、返されるオブジェクトは毎日同じです。
date.today
また、デバッグ目的でコンテキストに追加したところ、現在の日付が正しく出力されました。
uWSGI プロセスを再起動すると、QuerySet が正しく評価されます。
したがって、DB と memcached をこの問題から除外します。私には、tastypie または uWSGI プロセスによってある種の QuerySet キャッシングが行われているようです。
Tastypie キャッシングのドキュメントを読み、NoCache クラスを試しましたが成功しませんでした。
QuerySet キャッシングに関する Django のドキュメントも読んだことがありますが、QuerySet オブジェクトは各リクエストの後に破棄されるはずではありませんか?
アップデート
応答ヘッダーを確認したところ、クライアント キャッシュは 60 秒後に有効期限が切れ、最大経過時間は 1 時間でした。
HTTP/1.1 200 OK
Server: nginx/1.2.6
Date: Mon, 18 Feb 2013 10:47:03 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
Last-Modified: Mon, 18 Feb 2013 10:44:56 GMT
Expires: Mon, 18 Feb 2013 10:54:56 GMT
Cache-Control: max-age=600
アップデート
提案どおりにクエリを変更しました
queryset = Event.objects.filter(status='P').exclude(date_end__lt=date.today).order_by('-featured', 'date_end')
しかし、結果は同じです。
これはJSON出力の例です
{
"date_begin": "11/17/2012",
"date_end": "11/17/2012",
"description": "Presentazione del libro di Daniela Giusto",
"featured": false,
"location": "Libreria antiquaria Romeo Prampolini",
"resource_uri": "/api/v1/event/213/",
"time": "18:00:00",
"title": "Un insolito Jules Verne. Tradurre umorismo e fantasia",
"today": "2012-11-18",
}
date_begin
JavaScriptとdate_end
の互換性のために別の方法でフォーマットされています。