7

我在 Django 中有一个相当大的项目,这是一个相当大的框架,并且我正在使用相当多的应用程序、中间件、上下文处理器等。规模意味着当代码库的一部分针对我的请求运行时不希望它,确定它为什么这样做是困难的。直接的代码检查过于耗时,就像在调试器中单步执行整个请求一样。

在这种特殊情况下,我的问题是我在每个响应上都设置了“Vary: Cookie”,包括一些我想要大量缓存的以及我不应该需要任何 cookie 的地方。我怀疑,但不知道如何证明,某些中间件或上下文处理器正在访问request.session,即使它不使用结果——尽管它可能是间接访问,例如通过request.user. 当然,它可能完全是另外一回事。

在 Python 中,如何在大型代码库中从效果(“将 Vary 标头添加到响应中”)追溯到其原因?

4

1 回答 1

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__

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

于 2012-11-11T17:49:51.947 回答