かなり大規模なフレームワークであるDjangoには相当な規模のプロジェクトがありますが、合理的に多数のアプリ、ミドルウェア、コンテキストプロセッサなどを使用しています。スケールとは、コードベースの一部が、私がそれが欲しくない要求のために走ったときに、それがなぜ起こったのかを特定することが難しいことを意味します。デバッガでリクエスト全体をシングルステップで処理するのと同じように、コードの直接検査は時間がかかりすぎます。大規模なPythonコードベースでのエフェクトからその原因へのトレース
私の問題は、多量のキャッシュを必要とするものや、クッキーを必要としないものを含め、すべてのレスポンスに「Vary:Cookie」を設定していることです。たとえそれが結果を使用しない場合でも、request.session
にアクセスしているミドルウェアまたはコンテキストプロセッサは、request.user
などの間接アクセスである可能性がありますが、それを証明する方法はわかりません。もちろん、それはまったく別のものかもしれません。
Pythonでは、大きなコードベースの原因に戻って、どのように(「Varyヘッダがレスポンスに追加されましたか」)、どのようにトレースしますか?
こんにちは。私はdjangoに慣れていませんが、 'A ['x'] = y'を実行する必要があり、' A'が組み込みオブジェクトではない場合は、A .__ setitem__をあなた自身のものに置き換えることができます'__setitem__'を実行した後に" Vary:Cookie "ヘッダが現れているかどうかをチェックし、もしそうなら、それを引き起こしたものにあなたを誘導するコールスタックを出力するだけです。別の方法は、プログラムを1行ずつ実行するデバッガを作成し、必要なヘッダが特定のオブジェクトに追加されているかどうかを毎回確認することです。 –
ありがとう、@alex_jordan、それは良いスタートです。どのようにプログラムスタックで呼び出しスタックを印刷しますか?そして、この場合は、フラグが別の場所に設定されているとヘッダーが追加されるので、呼び出しスタックがどのフラグをトリガーしたかを教えてくれます。フラグが設定されたときにフィールドの割り当てを見つけることができますか?最後に、問題のオブジェクトは要求ごとに割り当てられます。すべてのインスタンスでこれを行うには、元のクラスに猿を貼り付けることはできますか? –
Jamey、私が下で提供した解決策はちょうどそれを行い、djangoエラー報告を使用するので、スタックトレースの印刷の詳細について心配する必要はありません。 – BenTrofatter