Кэширование (поддельного) статического содержимого, которое фактически является динамическим для 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-заголовки?

Редактировать 12 апреля 2011

Я решил это, просто установив два заголовка 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

Ответ 1

Посмотрите Статическая служба в блоге Nick.

Здесь все, что вам нужно знать о Условный запрос и как правильно получить и установить правильные заголовки HTTP:

  • Обработка заголовков запросов Http (If-Modified-Since, If-None-Match)
  • Обработка заголовков Http-ответов (Last-Modified, ETag)