11

S3(およびS3BotoStorage)で静的ファイルにdjango-storagesを使用しています。ローカルマシンからcollectstaticを実行すると、動作は期待どおりであり、変更されたファイルのみがS3にプッシュされます。このプロセスでは、変更された時刻を確認するためにpython-dateutils1.5が必要です。

ただし、Herokuで同じことを行うと、セットアップは同じですが、すべてのファイルがプッシュされます。次に、Heroku自体のファイルの変更時刻を調べたところ、os.stat(static_filename).st_mtimeは最後のプッシュの時刻と同じであるように見えます。

これは予想される動作ですか?gitから変更がない場合でも、herokuはファイルをコピーしますか?

4

6 に答える 6

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これはラボから本番環境に移行した可能性がありますか?

注意: デプロイは Heroku python ビルドパックによって管理されています。こちらで確認できます - https://github.com/heroku/heroku-buildpack-python/

編集1

DISABLE_COLLECTSTATICこれについて一連のテストを行ったところ、設定に関係なく、実際に collectstatic が無効になっていることを確認できuser-env-compileます-それは現在メイントランクにあると思います(ただし、それは推測です)。設定が何であるかを気にしないようです-DISABLE_COLLECTSTATIC構成変数として存在する場合、それが使用されます。

于 2014-02-25T16:57:40.717 に答える
8

s3 への django の静的デプロイには、ローカルでも heroku サーバーからでも、 collectfast パッケージを使用することを強くお勧めします。変更された日付を無視し、s3 API が非常に迅速に提供する md5 ハッシュと、(オプションの) キャッシングを利用して、静的デプロイをズームします。私の静的デプロイは 10 ~ 15 分から 2 分未満になり、実際に変更されたファイルのみがデプロイされます。

于 2014-01-03T17:25:34.510 に答える
5

まったく同じ問題が発生したばかりで、Heroku のサポートに連絡して、何が起こっているのかを調べました。彼らへの私の質問は

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

ファイルを静的アセットの最終ストレージ バックエンドにコピーする必要があるかどうかを評価するときに、Django のcollectstaticコマンドがファイルの変更日のみをチェックすることを考慮すると、新しいプッシュごとに、すべてのファイルが最初にリモート ストレージから削除されることを意味します (このケース S3) をアップロードしてから、再アップロードします。これは、消費される帯域幅と行われる要求の点で、非常に遅く無駄なプロセスです。

今日、Herokuのサポートスタッフの一人「Caio」さんから頂いた回答は、

こんにちは、それが現在の仕組みです、はい。お客様のフィードバックをランタイム チームに転送し、元の日付でファイルをパッケージ化できるかどうかを確認しています。

于 2013-01-22T16:49:28.993 に答える
1

Alen が確認したように、Heroku はデプロイ時にファイルの変更日を変更します。ただし、Amazon S3 には、ファイル コンテンツの md5 ハッシュである etag と呼ばれる属性もあります。この Django スニペットで実装されているように、これを使用して、変更日の代わりにファイルが変更されたかどうかを確認できます。

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

于 2013-03-19T12:45:54.420 に答える
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'

`` `

私はこれをmysite/disablecollectstatic / management /commandsに保持します次に本番環境に保存します:

INSTALLED_APPS += ('mysite.disablecollectstatic',)

または、実際にコマンドを呼び出す前に、Herokuが最初にドライランを実行するという事実を使用することもできます。失敗した場合は実行されません。つまり、エラーが発生する可能性があります(たとえば、設定の静的ルートを削除するなど)が、このアプローチでは緊張します。

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

于 2013-01-23T20:12:38.560 に答える