12

django staticfiles + django-storagesと Amazon S3 を使用してデータをホストしています。コマンドを実行するたびにmanage.py collectstaticすべてのファイルがサーバーにアップロードされることを除いて、すべてがうまく機能しています。

管理コマンドStorage.modified_time()は、django-storages の S3 ストレージに実装されていないタイムスタンプを比較しているようです。

S3ファイルが変更されたかどうかをどのように判断しますか?

ファイル パスと最終変更データをデータベースに保存できました。または、最後に変更されたデータを Amazon から取得する簡単な方法はありますか?

python-boto別のオプション:最初にアップロードするときに、ローカルの変更日を配置できる場所に任意のメタデータを割り当てることができるようです。

とにかく、それは一般的な問題のように思えるので、他の人が使用した解決策を尋ねたいと思います. ありがとう!

4

2 に答える 2

12

(1.1.3)の最新バージョンは、django-storagesS3Botoを介したファイル変更の検出を処理します。

pip install django-storagesそして、あなたは今元気です:)オープンソースが大好きです!

更新:S3Botoクラスを使用している場合は、設定ファイルでAWS_PRELOAD_METADATAオプションをに設定して、同期を非常に高速にします。True彼のS3を使用する場合は、彼のPreloadedS3クラスを使用してください。


更新2:コマンドの実行はまだ非常に遅いです。


更新3:問題を修正するためにdjango-storagesリポジトリをフォークし、プルリクエストを追加しました。

問題はmodified_time、フォールバック値が使用されていなくても呼び出されるメソッドにあります。フォールバックをブロックに移動して、リターンがifあった場合にのみ実行されるようにしましたgetNone

entry = self.entries.get(name, self.bucket.get_key(self._encode_name(name)))

する必要があります

    entry = self.entries.get(name)
    if entry is None:
        entry = self.bucket.get_key(self._encode_name(name))

現在、パフォーマンスの違いは、100秒から1000リクエストの場合の<.5秒からです。


アップデート4:

10k以上のファイルを同期する場合、S3は結果をページ分割して5〜10秒の同期時間を発生させるため、botoは複数のリクエストを行う必要があると思います。これは、ファイルが増えるにつれて悪化するだけです。

解決策は、カスタム管理コマンドを使用django-storagesするか、ファイルがS3に保存され、他のすべてのファイルのメタデータを含むファイルを更新することです。このメタデータは、コマンドを介してファイルが更新されるたびに更新されますcollectstatic

他の方法でアップロードされたファイルは検出されませんが、唯一のエントリポイントが管理コマンドであるかどうかは関係ありません。

于 2011-12-09T02:20:08.333 に答える
1

ここで同じ質問に答えましたhttps://stackoverflow.com/a/17528513/1220706https://github.com/FundedByMe/collectfastをチェックしてください。リモート S3 ファイルの ETag をキャッシュし、毎回ルックアップを実行する代わりに、キャッシュされたチェックサムを比較するプラグ可能な Django アプリです。インストール手順に従い、collectstatic通常どおり実行します。デプロイごとに平均約 1 分 30 秒から約 10 秒かかりました。

于 2013-07-08T14:01:23.490 に答える