GAE:使用webapp2启用边缘缓存(Python)

时间:2013-02-23 19:33:30

标签: google-app-engine webapp2

youtube上有这个新视频,展示了GAE架构中EdgeCaching的优势,在视频的这个特定点上,他们展示了它的易用性: http://www.youtube.com/watch?v=QJp6hmASstQ#t=11m12

不幸的是,这并不容易......

我希望使用Google提供的webapp2框架启用边缘缓存。

我在打电话:

self.response.pragma = 'Public'
self.response.cache_expires(300)

但它似乎被其他东西所覆盖。

我得到的标题是:

HTTP/1.1 200 OK
Pragma: Public
Cache-Control: max-age=300, no-cache
Expires: Sat, 23 Feb 2013 19:15:11 GMT
Content-Type: application/json; charset=utf-8
Content-Encoding: gzip
X-AppEngine-Estimated-CPM-US-Dollars: $0.000085
X-AppEngine-Resource-Usage: ms=39 cpu_ms=64
Date: Sat, 23 Feb 2013 19:10:11 GMT
Pragma: no-cache
Expires: Fri, 01 Jan 1990 00:00:00 GMT
Cache-Control: no-cache, must-revalidate
Vary: Accept-Encoding
Server: Google Frontend
Content-Length: 600

我正在使用ndb顶级:

app = ndb.toplevel(webapp2.WSGIApplication(...

我尝试了这里解释的技术,但它们似乎不适用于webapp2: http://code.google.com/p/googleappengine/issues/detail?id=2258#c14

我也看了这篇文章: https://groups.google.com/d/topic/webapp2/NmHXoZZSVvo/discussion

我尝试手动设置所有内容但没有成功。有些东西会覆盖我的缓存设置。

有没有办法让它与webapp2一起使用?欢迎任何其他选择。

编辑:我正在使用版本前缀为http://version.appname.appspot.com的网址,这可能是我遇到问题的原因。

3 个答案:

答案 0 :(得分:6)

这应该是你所需要的:

self.response.cache_control = 'public'
self.response.cache_control.max_age = 300

答案 1 :(得分:3)

检查Caching Details以获取更多信息,可能是您违反了一些规则。接下来最好的部分:

只有在满足以下所有条件时,才能将响应存储在Cloud CDN缓存中:

  • 它由启用了缓存的后端服务提供服务。
  • 这是对GET请求的回复。
  • 状态代码为200,203,300,301,302,307或410。
  • 它有一个Cache-Control:public指令。
  • 它有一个Cache-Control:s-maxage,Cache-Control:max-age或Expires 报头中。
  • 它有Content-Length标头或Transfer-Encoding标头。

此外,还有一些检查会阻止响应的缓存。如果满足以下任何条件,则不会缓存响应:

  • 它有一个Set-Cookie标头。
  • 它的身体超过4 MB。
  • 它有一个Vary标头,其值不是Accept,Accept-Encoding或 - Origin。
  • 它有一个Cache-Control:无存储,无缓存或私有指令。
  • 相应的请求有一个Cache-Control:no-store指令。

答案 2 :(得分:1)

我猜你正在混淆两个相关但截然不同的想法。

您链接的视频谈到的第一个想法是安排在您的应用中使用专门提供静态内容的App Engine服务器池中的某些文件。这比让您的应用程序提供这些文件更快,因为启动应用程序的新实例以提供静态文件不会有任何延迟。 (强烈考虑以这种方式提供你的.js和.css。)这个静态服务工具完全在应用更新(上传)时间控制,通过你在app.yaml(或appengine-web.xml为Java应用程序做出的声明)。

第二个想法是通过HTTP响应标头安排应用程序发出的页面可以通过app引擎外部的缓存进行缓存。

如果将文件声明为静态文件,则可以控制与文件一起提供的附加HTTP响应标头。请参阅documentation on configuring static files