リクエストごとに 1 回だけ実行する必要がある単純なカスタム コンテキスト プロセッサを作成しました。いくつかのロギング フックを挿入した後、リクエストごとに 2 回呼び出されていることがわかりました。
これは、ドキュメントで見逃された既知の「機能」ですか? 継承ツリーのテンプレートの数に関連していますか? 1.03のバグですか?
リクエストごとに 1 回だけ実行する必要がある単純なカスタム コンテキスト プロセッサを作成しました。いくつかのロギング フックを挿入した後、リクエストごとに 2 回呼び出されていることがわかりました。
これは、ドキュメントで見逃された既知の「機能」ですか? 継承ツリーのテンプレートの数に関連していますか? 1.03のバグですか?
これは予期された動作ではありません。コンテキスト プロセッサは、RequestContext がインスタンス化されるたびに 1 回実行されます)。テンプレートの継承の場合、同じコンテキスト インスタンスが親テンプレートに渡されるため、コンテキスト プロセッサが再度実行されることはありません。ロギングが誤解を招く (@Vinay Sajip のコメントを参照) か、コード内のどこでリクエストごとに余分な RequestContext が実行されるかを把握する必要があります (インクルージョン タグまたはテンプレートをレンダリングするその他のカスタム テンプレート タグを使用しているか)。 RequestContext をインスタンス化しますか?)
EDIT申し訳ありませんが、「包含タグ」とは、(一般的な意味で) 別のテンプレートをレンダリングするタグを意味し、inclusion_tag デコレータを使用するタグではありません。コンテキストを取る通常の include_tag は、新しい RequestContext をインスタンス化するのではなく、単に既存のコンテキスト オブジェクトを渡す必要があります。
試してみることのできることの 1 つは、コンテキスト プロセッサに "import pdb; pdb.set_trace()" を配置し、Django 開発サーバーでコードを実行し、コンテキスト プロセッサがヒットするたびにコンソールで pdb を使用してスタック トレースを調べることです。 、どこから呼び出されているかを確認します。
私の場合、このバグは使用時に発生しdjango
debug_toolbar
ます。これを避けるために、コメントしてみてください
debug_toolbar.middleware.DebugToolbarMiddleware
私は問題を理解しました。元のコンテキスト以外の辞書が返された場合、コンテキスト プロセッサが再度実行されるようです。理由はわかりませんが、基になるコードを見ていないためわかりませんが、元のコンテキストを更新して問題が解決したことを返した後です。ありがとう。
これは実稼働 Web サーバー、Apache などで発生していますか、それとも組み込みの開発サーバーで発生していますか? 時折、ローカルで同様の動作に気付きましたが、それはランサーバーの単なる癖に過ぎないと確信しています。
今後の参考のために-私の問題はrender_to_string
ビュー関数内にあり、コンテキストプロセッサが2回実行されました。
comments = render_to_string('comments.html', {'comments': comments_list}, request)
この呼び出しはキャッシュされていたため、問題がどこにあるのかを特定するのが少し困難でした。とにかく、render_to_string
この特定のケースでは必要なかったので、呼び出しからリクエストコンテキストを削除することで解決しました:
comments = render_to_string('comments.html', {'comments': comments_list})
その後、コードをリファクタリングしてrender_to_string
すべてを削除し、スニペットをテンプレートに直接キャッシュしました。ただし、ビュー関数内で使用する正当なケースrender_to_string
(たとえば、電子メール テンプレートのレンダリングなど) があるため、問題が発生する可能性があります。