3

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_beginJavaScriptとdate_endの互換性のために別の方法でフォーマットされています。

4

2 に答える 2

3

あなたの QuerySet オブジェクトは、Tastypie ではリクエスト スコープではありません。リクエスト間で持続します。したがって、date.today は 1 回だけ評価され (date.today 関数を戻り値の代わりに引数として渡しても)、期待どおりのリクエストごとではありません。修正方法については、Tastypie のドキュメントからこのレシピを確認してください。

于 2013-02-21T16:09:06.620 に答える
1

これをクエリセット値として試してください:

queryset = Event.objects.filter(status='P').exclude(date_end__lt=date.today)
于 2012-11-17T20:28:44.827 に答える