Django每个站点的缓存和变化:缓存

Django每个站点的缓存和变化:缓存,django,caching,nginx,django-views,Django,Caching,Nginx,Django Views,我注意到我的逐站点缓存不起作用,因为页面响应标题包括: Vary:Cookie 因为我已经安装了google analytics,它会在每次页面加载时更新cookie,这会使缓存不可用 我不确定是否隐式添加了Vary:Cookie-to-page响应头,或者它来自何处。谢谢你的帮助 Django 1.3.1 更新: 事实证明,当包含session中间件并访问session时,它会将Vary:Cookie头添加到响应中。在我的例子中,原因是第三方应用程序正在访问会话。这个问题实际上并不是一个问题

我注意到我的逐站点缓存不起作用,因为页面响应标题包括:

Vary:Cookie
因为我已经安装了google analytics,它会在每次页面加载时更新cookie,这会使缓存不可用

我不确定是否隐式添加了Vary:Cookie-to-page响应头,或者它来自何处。谢谢你的帮助

Django 1.3.1

更新:


事实证明,当包含
session
中间件并访问
session
时,它会将
Vary:Cookie
头添加到响应中。在我的例子中,原因是第三方应用程序正在访问会话。

这个问题实际上并不是一个问题:),但我想我要指出一些事情

。但是你可以通过设置装饰器上的
vary\u来告诉他

这意味着你所说的每站点缓存是另外一回事——你提到了谷歌分析,尽管还不清楚这与缓存本身有多大关系

因此,您可能有一些缓存前置

如果要使用or,可以自定义
vary
影响缓存的方式,使用nginx,还可以将其从响应中删除,以便客户端不会收到它(包括谷歌分析)

如果您只是想让javascript看不到会话COOKIE,那么有一个特定的设置:
session\u COOKIE\u HTTPONLY

您应该有一个按url模式的策略,通过使用或忽略Vary和Expire头,使缓存行为适应依赖于或不依赖于登录用户的页面

[编辑]

使用Nginx进行缓存 如果您将nginx用作前端并希望使用它进行缓存,有一种非常简单的方法可以强制缓存不需要cookie的视图,方法如下:

您将需要定义缓存,有关签出的详细信息:

与uwsgi非常相似的设置适用,只是它们的前缀是uwsgi;签出,但考虑到它没有“代理”文档那么详细,我以它为例

如果您想完全“删除”cookies,您可以:

location /path/ {
    proxy_hide_header Set-Cookie;
}
但我不确定这是你想要做的

另一方面,如果您还想更好地控制浏览器的缓存,可以根据需要重新设置vary标头:

location /path/ {
    proxy_hide_header Vary;
}
您甚至可以将其重置为其他内容:

    add_header    Vary User-Agent;

你是如何解决这个问题的?你必须摆脱谷歌分析吗?这是针对外国投资公司的,我填了一个问题,但还没有收到任何确认或回复。如果您感兴趣:从这个:会话框架非常酷,它会自动向响应添加一个“Vary:Cookie”头,但只有当它被访问时。因此,考虑到上述声明以及会话被访问,每个站点的缓存将是敏感的cookie。GA cookie在每次访问页面时都会发生变化,因此会使缓存不可用。@bmichelac我的观点是,如果您有一个前端(如NGINX或VARNISH)来管理缓存,您可以简单地告诉他忽略VARY/或/忽略GA cookie。在django中,您可以调整构建缓存的方式。如果没有关于全局体系结构的更多信息,就很难更加具体,但在任何情况下,您都可以调整缓存以忽略所有cookie或某些cookie。如果你的问题是针对没有前端和虚拟机的,你应该说清楚!如果可以调整每个站点的缓存以忽略cookies,我想这将是Matt和我正在寻找的答案(我承认没有找到解决方法)。我正在使用nginx/uswgi,删除nginx中的cookie(以某种方式)对我来说也是一个解决方案。@bmichelac我添加了一些关于如何在nginx中进行缓存的信息,忽略了cookies。缓存有太多的选项(在前端、django等中),因此很难向您展示所有不同的方式或建议“最佳”解决方案。如果您使用的是nginx,这应该可以(遵循特定的uwsgi文档,但从代理服务器获取详细信息)!
    add_header    Vary User-Agent;