在GAE上为Python缓存假的静态内容而实际动态内容

10 投票
1 回答
1469 浏览
提问于 2025-04-16 14:52

在我的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日

我通过简单地设置两个头信息 ExpiresCache-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

1 个回答

6

可以看看 静态服务 这篇博客,作者是 Nick

里面有你需要了解的关于 条件请求 的所有信息,以及如何正确获取和设置 HTTP 头部信息:

  • 处理 HTTP 请求头部 (If-Modified-Since, If-None-Match)
  • 处理 HTTP 响应头部 (Last-Modified, ETag)

撰写回答