在GAE上为Python缓存假的静态内容而实际动态内容
在我的GAE应用中,我在app.yaml文件里有以下的处理程序:
- url: /lang/strings.js
script: js_lang.py
所以,当我访问 /lang/strings.js
时,实际上会调用js_lang.py这个请求处理程序,它会把响应的内容设置为 application/javascript
。我希望这个响应能够在浏览器中被缓存,这样请求处理程序就不会频繁被调用(比如,当我通过导入 /lang/strings.js?v=xxxx
来“失效”缓存时,这通常是在我部署新版本应用的时候)。
对于普通的静态内容,有一个 default_expiration
元素,这个非常方便。它会生成像这样的HTTP响应头:
Expires: Fri, 01 Apr 2011 09:54:56 GMT
Cache-Control: public, max-age=600
好的,问题来了:有没有简单的方法让我返回这样的头信息,而不需要我手动设置它们?或者,有没有现成的代码片段可以接受一些基本参数,比如“天数”,然后生成预期的HTTP头信息?
编辑于2011年4月12日
我通过简单地设置两个头信息 Expires
和 Cache-Control
来解决了这个问题,具体如下:
import datetime
thirty_days_in_seconds = 4320000
expires_date = datetime.datetime.now() + datetime.timedelta(days=30)
HTTP_HEADER_FORMAT = "%a, %d %b %Y %H:%M:00 GMT"
self.response.headers["Expires"] = expires_date.strftime(HTTP_HEADER_FORMAT)
self.response.headers["Cache-Control"] = "public, max-age=%s" % thirty_days_in_seconds