7

私はDjangoにかなり大きなプロジェクトを持っています。これはかなり大きなフレームワークであり、かなり多くのアプリ、ミドルウェア、コンテキストプロセッサなどを使用しています。スケールとは、コードベースの一部がリクエストに対して実行される場合、それを望まないでください、なぜそれがしたのかを特定するのは難しいです。デバッガーでリクエスト全体をシングルステップで実行するのと同様に、コードのストレートインスペクションには時間がかかりすぎます。

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

Pythonでは、効果(「Varyヘッダーが応答に追加されました」)から大規模なコードベースの原因までどのように追跡しますか?

4

1 に答える 1

3

考えは次のとおりです。モンキーパッチを適用してdjangoHttpResponseクラスを作成し、__setitem__設定されているヘッダーが。の場合にそのメソッドで例外が発生するようにしVaryます。これは、作成時に他の方法では何もしないミドルウェアから処理できます。ヘッダーを設定している行からのトレースバックが得られるはずです。

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設定ファイルのミドルウェアスタックの最初のものとしてミドルウェアをインストールします。

于 2012-11-11T17:49:51.947 に答える