1

私の場合、概要ページに表示されるドキュメントのサムネイルを含むデータベースがあります。ブラウザがサイトにアクセスするたびに、すべてのサムネイル画像が再度ダウンロードされるため、ダウンロード機能によってデータベースからすべての画像が再度読み込まれます。私はGAEで実行しているので、これは私のデータベースを駆動します-膨大な読み取り。

次の設定でクライアントサイトのキャッシュを有効にしようとしました。

@auth.requires_login()
def download():
  response.headers['Cache-Control'] = None
  response.headers['Pragma'] = None
  response.headers['Expires'] = None
  return response.download(request, db)

また、response.streamが役立つかもしれないことも読みましたが、web2pyの本には次のように書かれています。

上記のように、response.downloadは、アップロードフィールドを介して保存されたファイルを取得するために使用する必要があります。response.streamは、コントローラーによって作成された一時ファイルやStringIOオブジェクトを返すなど、他の場合に使用できます。

- 編集 -

クライアント側のキャッシュを有効にしました:

session.forget() #important
expire_time = datetime.timedelta(days=2)

response.headers['Cache-Control'] = 'private, max-age%d'%(60*60*24*2)
response.headers['Pragma'] = None
response.headers['Expires'] = (request.utcnow + expire_time).strftime("%a, %d %b %Y %H:%M:%S GMT")
response.headers['Content-Disposition'] = \
      'attachment;filename=' + filename + ';'

return response.stream(stream, filename=filename)
4

2 に答える 2

2

まず、画像が公開されており、表示するために認証を必要としない場合は、画像を/ uploadsフォルダーに保存する代わりに、/ staticフォルダーに保存して、静的ファイルとして提供することができます。その場合、ヘッダーはクライアント側のキャッシュ用に自動的に設定されます(これにより、より高速で効率的になります)。

次に、response.stream()アップロードされたファイルをストリーミングするために使用できますが、ファイルが配置されているフォルダーを自動的に識別したり、エンコードされたファイル名から元のファイル名をデコードしてContent-Dispositionヘッダーに追加したりすることはありません(とにかくこの場合は、画像を表示していてダウンロードしていないためです)。したがって、完全なファイルパスをに渡す限りresponse.stream()、この場合はそれを使用できるはずであり、キャッシュに適切に応答ヘッダーが設定されます。

最後に、応答ヘッダーを直接設定する場合は、次のようになります。

import os
import time
modified = os.stat(file)[stat.ST_MTIME]
mtime = time.strftime('%a, %d %b %Y %H:%M:%S GMT', time.gmtime(modified))
response.headers['Last-Modified'] = mtime
response.headers['Pragma'] = 'cache'
response.headers['Cache-Control'] = 'private'
于 2013-01-25T05:56:44.980 に答える
0

画像を提供する場合は、Google高性能画像提供を使用してみませんか。このAPI(get_serving_url)を使用して、Googleが画像を提供します。ハンドラーは必要ありません!高速で、サイズを変更でき、帯域幅がいくらかかかるだけです。

ただし、これは画像に対してのみ機能します。これは、304を含むblobstoreからCSSを提供するための私のコードの一部です。

class DynCSS(blobstore_handlers.BlobstoreDownloadHandler):

    def get(self, resource):                                        

        (key, _, _) = resource.rpartition('.')
        self.response.headers[str('ETag')] = str(key)
        if 'If-None-Match' in self.request.headers:
            etags = [x.strip()
                     for x in self.request.headers[str('If-None-Match')].split(',')]
            if key in etags:
                self.response.set_status(304) # optimize traffic 304
                return
        blob_info = blobstore.BlobInfo.get(key) 
        self.send_blob(blob_info, save_as=True)

リソース引数は、.cssが追加されたblob_keyです。そして、私はユニコードリテラルを使用します。

高性能画像配信の用途:get_serving_url https://developers.google.com/appengine/docs/python/images/functions

例 :

entity.serving_url = images.get_serving_url(entity.blob_key, size=None, secure_url=True)

使い方 :

  • 画像をblobstoreにアップロードします
  • blob_keyを画像file_nameと一緒にデータストアに保存します
  • get_serving_urlを作成します。一度作成するだけです。
  • テンプレートのimgタグで配信URLを使用します。

サービングURLは次のようになります: https://lh6.ggpht.com/lOghqU2JrYk8M-Aoio8WjMM6mstgZcTP0VzJk79HteVLhnwZy0kqbgVGQZYP8YsoqVNzsu0EBysX16qMJe7H2BsOAr4j =

于 2013-01-25T09:58:27.323 に答える