2012-11-11 9 views
7

かなり大規模なフレームワークであるDjangoには相当な規模のプロジェクトがありますが、合理的に多数のアプリ、ミドルウェア、コンテキストプロセッサなどを使用しています。スケールとは、コードベースの一部が、私がそれが欲しくない要求のために走ったときに、それがなぜ起こったのかを特定することが難しいことを意味します。デバッガでリクエスト全体をシングルステップで処理するのと同じように、コードの直接検査は時間がかかりすぎます。大規模なPythonコードベースでのエフェクトからその原因へのトレース

私の問題は、多量のキャッシュを必要とするものや、クッキーを必要としないものを含め、すべてのレスポンスに「Vary:Cookie」を設定していることです。たとえそれが結果を使用しない場合でも、request.sessionにアクセスしているミドルウェアまたはコンテキストプロセッサは、request.userなどの間接アクセスである可能性がありますが、それを証明する方法はわかりません。もちろん、それはまったく別のものかもしれません。

Pythonでは、大きなコードベースの原因に戻って、どのように(「Varyヘッダがレスポンスに追加されましたか」)、どのようにトレースしますか?

+1

こんにちは。私はdjangoに慣れていませんが、 'A ['x'] = y'を実行する必要があり、' A'が組み込みオブジェクトではない場合は、A .__ setitem__をあなた自身のものに置き換えることができます'__setitem__'を実行した後に" Vary:Cookie "ヘッダが現れているかどうかをチェックし、もしそうなら、それを引き起こしたものにあなたを誘導するコールスタックを出力するだけです。別の方法は、プログラムを1行ずつ実行するデバッガを作成し、必要なヘッダが特定のオブジェクトに追加されているかどうかを毎回確認することです。 –

+0

ありがとう、@alex_jordan、それは良いスタートです。どのようにプログラムスタックで呼び出しスタックを印刷しますか?そして、この場合は、フラグが別の場所に設定されているとヘッダーが追加されるので、呼び出しスタックがどのフラグをトリガーしたかを教えてくれます。フラグが設定されたときにフィールドの割り当てを見つけることができますか?最後に、問題のオブジェクトは要求ごとに割り当てられます。すべてのインスタンスでこれを行うには、元のクラスに猿を貼り付けることはできますか? –

+0

Jamey、私が下で提供した解決策はちょうどそれを行い、djangoエラー報告を使用するので、スタックトレースの印刷の詳細について心配する必要はありません。 – BenTrofatter

答えて

3

ここに考えがあります:ダークゴールのHttpResponseクラスをモンキーにして、設定されているヘッダがVaryの場合、__setitem__メソッドが例外を発生させます。それが作成されると、何もしない何のミドルウェアからでもこれを処理することができます。ヘッダーを設定している行から、良いトレースバックを得るはずです。

class MonkeyPatchMiddleware(object): 

    def __init__(self): 
     from django.http import HttpResponse 

     original_set_item = HttpResponse.__setitem__ 

     def __setitem__(self, header, value): 
      if header == "Vary": 
       raise ValueError 
      original_set_item(self, header, value) 

     HttpResponse.__setitem__ = __setitem__ 

ミドルウェアスタックの最初のものとして、django設定ファイルにミドルウェアをインストールします。

+0

ありがとう!ミドルウェアを追加するのではなく、アプリの 'views.py'でこれを試してみる方が便利だとわかりました。トレースバックは 'patch_vary_headers'を呼び出すのは' SessionMiddleware.process_response'でしたが、なぜそれを調べるために 'request.session.accessed'を設定する必要があるのか​​を知る必要があったと教えてくれました。 'SessionBase.accessed = property(lambda self:False、raise_on_true)でのMonkey-patchingは本当の根本的な原因で私にトレースバックを与えました。 –

関連する問題