在大型Python代码库中将效果追溯到其原因

Jam*_*arp 7 python debugging

我在Django有一个相当大的项目,这是一个相当大的框架,我使用了相当多的应用程序,中间件,上下文处理器等.规模意味着当代码库的一部分运行请求时我我不想要它,找出它的原因很难.直接代码检查非常耗时,就像在调试器中单步执行整个请求一样.

在这个特殊情况下,我的问题是我在每个响应上都设置了"Vary:Cookie",包括一些我想要高速缓存的地方以及我不需要任何cookie的地方.我怀疑,但不知道如何证明,一些中间件或上下文处理器request.session即使在不使用结果时也在访问- 尽管它可能是间接访问,例如通过request.user.当然,它可能完全不同.

在Python中,您如何从一个效果("Vary标头被添加到响应中")中追溯到大型代码库中的原因?

Ben*_*ter 3

这里有一个想法:猴子修补 django HttpResponse 类,以便它的__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__
Run Code Online (Sandbox Code Playgroud)

将中间件安装为 django 设置文件中中间件堆栈中的第一件事。