5

ユーザーがアップロードした画像を A​​mazon の S3 に保存し始めました。収納の悩みが解消されたので良かったです。ただし、ブラウザに画像をキャッシュさせることに関しては苦労しています。

私はジャンゴストレージを使用しています。彼らのドキュメントでは、設定で AWS_HEADER 変数を設定することにより、画像のリクエストヘッダーに物を置くことができると指定しています。私はそれをやっていますが、結果は得られません。

基本的に、アプリが画像を要求すると、毎回 200 が返されます。ARG ...ブラウザで画像に直接アクセスすると(リンクをコピーして新しいウィンドウに貼り付けます)、その後は毎回200と304が表示されます。

毎回画像を再ダウンロードするのでとてもイライラします。一部のページには最大 25 個の小さなサムネイルがあり、ページがリロードされるたびにすべてが再ダウンロードされます。

djangos staticfiles を使用して静的ファイルを提供していますが、正常に動作しています。ファイルがキャッシュされた後、200 を取得し、次に 304 を取得します。

これがsettings.pyの私のAWS設定です

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
AWS_ACCESS_KEY_ID = '***'
AWS_SECRET_ACCESS_KEY = '***'
AWS_STORAGE_BUCKET_NAME = 'foobar_uploads'
AWS_HEADERS = {
    'Expires': 'Thu, 15 Apr 2020 20:00:00 GMT',
    'Cache-Control': 'max-age=86400',
}

AWS_CALLING_FORMAT = CallingFormat.SUBDOMAIN

アプリが画像をリクエストするときのリクエスト ヘッダーとレスポンス ヘッダーは次のとおりです (機密情報と思われる部分を「*」に置き換えました)。

##request##
GET /user_uploads/*****/2012/3/17/14/46/thumb_a_28_DSC_0472.jpg?Signature=FVR6T%2BXFwHMmdQ9K3n7Ppp7QxoY%3D&Expires=1332023525&AWSAccessKeyId=***** HTTP/1.1
Host: *****_user_uploads_sandbox.s3.amazonaws.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.79 Safari/535.11
Accept: */*
Referer: http://localhost:8000/m/my-photos/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3


##response##
HTTP/1.1 200 OK
x-amz-id-2: Hn3S+3gmeLHIjKCpz+2ocE6aPsLCVHh56jJYTsPHwxU98y89x+9X1Ml202evBUHT
x-amz-request-id: 528CEB880CA89AD3
Date: Sat, 17 Mar 2012 21:32:06 GMT
Cache-Control: max-age=86400
Expires: Thu, 15 Apr 2020 20:00:00 GMT
Last-Modified: Sat, 17 Mar 2012 20:46:29 GMT
ETag: "a3bc70e0c3fc0deb974edf95668e9030"
Accept-Ranges: bytes
Content-Type: image/jpeg
Content-Length: 8608
Server: AmazonS3

画像へのリンクをコピーして貼り付けて手動で画像を要求するときの要求/応答ヘッダーは次のとおりです。

##request##
GET /user_uploads/*****/2012/3/17/14/46/thumb_a_28_DSC_0472.jpg?Signature=FVR6T%2BXFwHMmdQ9K3n7Ppp7QxoY%3D&Expires=1332023525&AWSAccessKeyId=***** HTTP/1.1
Host: porlio_user_uploads_sandbox.s3.amazonaws.com
Connection: keep-alive
Cache-Control: max-age=0
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.79 Safari/535.11
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
If-None-Match: "a3bc70e0c3fc0deb974edf95668e9030"
If-Modified-Since: Sat, 17 Mar 2012 20:46:29 GMT



##response##
HTTP/1.1 304 Not Modified
x-amz-id-2: FZH0imrbNxziMznhl5zAoo38CaM7Z+TFnd8R6HtTYB3eTmVpCih+1IniKaliRo18
x-amz-request-id: 3CACF77FBB39D088
Date: Sat, 17 Mar 2012 21:33:22 GMT
Last-Modified: Sat, 17 Mar 2012 20:46:29 GMT
ETag: "a3bc70e0c3fc0deb974edf95668e9030"
Server: AmazonS3

「If-None-Match:」や「If-Modified-Since:」など、いくつかの違いがあることがわかります。それらを設定すれば、思い通りに動作するはずだと思います。

これを行う簡単な方法はありますか?

助けてくれてありがとう!

編集 1: 私はこの記事を読みましたが、うまく翻訳できませんでした.. http://coder.cl/2012/01/django-and-amazon-s3/comment-page-1/

4

2 に答える 2

5

django-storages に認証クエリを静的メディアに追加させたくない場合は、以下を に追加しますsettings.py

AWS_QUERYSTRING_AUTH = False

これは、django-storages を介して、指示されない限りクエリ文字列を自動的に追加する S3 Boto バックエンドが原因です。アプリケーションのソース コードを見ると、ファイル内に文書化されていない余分な設定があることがわかりますsettings.py(34 行目あたり)。

Github for django-compressor hereで提起された同様の問題に回答しました。

于 2012-03-26T04:24:44.440 に答える
1

アプリのリクエストで「If-None-Match」または「If-Modified-Since」を送信しているようには見えないため、S3 は、あなたが何を持っているかわからないため、304 を返す方法がありません。 . ご覧のとおり、ブラウザーにはファイルがキャッシュされているため、これらのヘッダーの両方が送信され、適切な 304 応答が返されます。

ファイルのローカル コピーを保持している場合は、Last-Modified や ETag を保存し、イメージのリクエストと共に送信する必要があります。

関連する余談ですが、max-age ヘッダーのみを使用して Expires をスキップすることを検討します。仕様によると、Expires は 1 年以上先にすべきではありません。Expires と max-age の両方を使用することは冗長であり、max-age は相対的な量に設定できます (既に行ったように)。

キャッシングに関するこの記事と、構成を確認するための関連するREDbotツールを強くお勧めします。

于 2012-03-18T00:13:50.443 に答える