目次

内容

参考

概要

  • GAE上のオンラインアルバムのCPU負荷や帯域を軽減させるため、一度配信された写真データをブラウザにキャッシュさせる仕組み
  • 具体的な仕組みは次の通り
    • 配信する写真データのHTTPヘッダに「last-modified」を指定
    • ブラウザからif-modified-sinceでリクエストが来たら、アップロード日時と比較し、同じなら304を返す

スクリプト

  • 「photo」に写真のオブジェクトが入っている
    • プロパティ「uploaded」が更新日、「file」が画像データ
  • 日付の比較は文字列で行う
    • GAEのDataStoreの日付はミリ秒まで含まれるので、date型の比較が難しい
    • 最終更新日より新しいキャッシュなんてあり得ないから、単純比較でOK(と思う)
  • キャッシュの有効期間は1年間(31536000秒)
### 最終更新日をチェック(キャッシュが有効なら304を返す)
lastmod = photo.uploaded
if self.request.headers.has_key('If-Modified-Since'):
    modsince = self.request.headers.get('If-Modified-Since')
    if modsince == lastmod.strftime("%a, %d %b %Y %H:%M:%S GMT"):
        self.error(304)
        return
### キャッシュを効かせて写真を出力
self.response.headers['Cache-Control']='public, max-age=31536000'
self.response.headers['Last-Modified'] = lastmod.strftime("%a, %d %b %Y %H:%M:%S GMT")
expires = lastmod + datetime.timedelta(days=365)
self.response.headers['Expires'] = expires.strftime("%a, %d %b %Y %H:%M:%S GMT")
self.response.headers['Content-type'] = 'image/jpeg'
self.response.out.write( photo.file )

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-09-25 (日) 19:27:03 (444d)