2013-01-19 15 views
10

私はS3(とS3BotoStorage)の静的ファイルにdjango-storageを使用しています。私のローカルマシンからcollectstaticを実行すると、動作は予期したとおりに行われ、変更されたファイルだけがS3にプッシュされます。このプロセスは修正された時間をチェックするためにpython-dateutils 1.5を必要とします。HerokuのDjango collectstaticが毎回S3にプッシュします

しかし、ヘロクで同じ操作を行うと、セットアップは同じですが、すべてのファイルがプッシュされます。私はその後、Heroku上のファイルの変更時刻を調べました。それは、os.stat(static_filename).st_mtimeは最後のプッシュの時刻と同じです。

これが期待どおりの動作ですか? herokuはgitからの変更がなくてもファイルをコピーしますか?

答えて

5

私はまったく同じ問題を抱えており、何が起こっているのかを知るためにHerokuのサポートに連絡しました。私の質問は

私はいくつかの展開を行うファンキーな問題に遭遇しました。それぞれのプッシュで、すべてのファイルで変更された日付は、新しいdeploy/git pushが発生するまでに更新されているようです。これは意図された動作ですか?

Djangoのcollectstaticコマンドは、静的アセットの最後のストレージバックエンドにファイルをコピーするかどうかを評価する際に、ファイルの変更日をチェックするだけであることを考慮すると、新しいプッシュごとに、リモートストレージ(この場合はS3)して再アップロードします。これは、消費される帯域幅と要求の観点から、非常に遅く、無駄なプロセスです。

私は、「カイオ」から今日Herokuののサポートスタッフの1を受け取った答えは、

たこんにちは、それはそう、それが現在どのように動作するかです。ファイルを元の日付にパッケージ化できるかどうかを確認するため、フィードバックをランタイムチームにルーティングしています。

+1

もう1つのアプローチは、最後に変更されたストレージバックエンドチェックハッシュを使用することです。 S3にはファイルのmd5であるetagがありますが、それは文書化されていないと思います。 –

0

私はこれが迷惑であることに同意します。あなたができることはいくつかあります。私はcollectstaticコマンドを無効にして、私のプロダクション設定で配線します。以下は、私が使用するコマンドです:

`` `

from django.core.management.base import BaseCommand 
class Command(BaseCommand): 
    args = '<none>' 
    help = "disables collectstatic cmd in contrib" 
    def handle(self, *args, **kwargs): 
     print 'collectstatic disabled' 

` ``

私は、生産の設定で次に コマンド/個人用サイト/ disablecollectstatic /管理でこれを保つ:

INSTALLED_APPS += ('mysite.disablecollectstatic',) 

また、実際にコマンドを呼び出す前に、Herokuがドライランを実行しているという事実を利用することもできます。それが失敗した場合、それはあなたが(たとえば、多分あなたの設定で静的ルートを削除することで)エラーを工夫できることを意味され、それを実行されませんが、このアプローチは、私が神経質になります:

確認として

https://devcenter.heroku.com/articles/django-assets#detection

+1

環境変数varを設定することで、collectstaticコマンドを完全に無効にすることができます。それはあなたの後ろにある場合です。 https://devcenter.heroku.com/articles/django-assets#disabling-collectstatic –

1

Alenによって、Herokuは展開時にファイルの変更日を変更します。しかし、Amazon S3にはファイル内容のmd5ハッシュであるetagという属性もあります。これを使用して、this Django snippetに実装されているように、変更日ではなくファイルが変更されているかどうかを確認することができます。

私はそのコードを取り、それをパッケージ化し、私が見つけたいくつかのエラーを修正し、django-s3-collectstaticとGithubに入れました。新しいファイルのみをアップロードする新しい管理コマンドfasts3collectstaticが含まれています。 Githubページでインストール手順を確認してください。

1

なぜローカルマシンからcollectstaticを実行しないのですか?

python manage.py collectstatic --noinput --settings=settings.[prod] 
6

私は強くローカルかどうか、Herokuのサーバから、S3に任意のジャンゴ静的展開にcollectfast packageを使用することをお勧めします。修正された日付は無視され、s3 apiが非常に迅速に提供するmd5ハッシュと、静的な展開を行うためのキャッシュ(オプション)を利用してズームが行われます。私の静的な展開は〜10-15分から< 2分になり、実際に変更されたファイルだけが展開されます。

+0

ありがとう!試してみましょう。 –

15

アプリの環境設定としてDISABLE_COLLECTSTATIC=1を設定してみてください。これは、すべてのプッシュで実行されないようにする必要があります。

詳細については、こちらの記事を参照してください - https://devcenter.heroku.com/articles/django-assets

> Sometimes, you may not want Heroku to run collectstatic on your behalf. 
> You can disable collectstatic by enabling user-env-compile as well: 

$ heroku labs:enable user-env-compile 
$ heroku config:set DISABLE_COLLECTSTATIC=1 

私が見つけたがそれだけで行いませんコンフィグ設定 - それは、これが生産にラボから渡されたことがあることかもしれ - もuser-env-compileを有効にする必要が?私はちょうどこの上でテストの束をやった、とすることを確認することができます1

https://github.com/heroku/heroku-buildpack-python/

EDIT -

NB展開はここで見ることができHerokuのパイソンbuildpack、によって管理されていますDISABLE_COLLECTSTATICは、実際にはuser-env-compileの設定に関係なく、collectstaticを無効にします - 私はそれがメイントランクにあると思いますが(それは推測です)設定が何であるか気にしていないようです - DISABLE_COLLECTSTATICが設定変数として存在する場合、それが使用されます。

+0

uは私の日を救った。 – levi

関連する問題