django アプリを Heroku に移行しようとしていますが、静的ファイルを処理する適切な方法は何か疑問に思っていました。git 経由で Heroku にプッシュするだけですか? それとも、SW3か何かに保存する必要がありますか? また、STATIC_ROOTなどはどうあるべきですか?
ありがとう!
それらをS3などのサービスに外部的に保存する必要があります。Herokuは静的ファイルを提供できますが、そのようには設計されていません。
S3を使い始めるための良い入門書は次のとおりです。
https://devcenter.heroku.com/articles/s3
django-storages http://django-storages.readthedocs.org/en/latest/index.htmlを使用して、静的ファイルをS3バケットに収集し、それに応じて提供します。
S3に必要な設定は次のとおりです。
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
STATICFILES_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
AWS_ACCESS_KEY_ID = 'access-id'
AWS_SECRET_ACCESS_KEY = 'secret-key'
AWS_STORAGE_BUCKET_NAME = 'bucket-name'
AWS_PRELOAD_METADATA = True # necessary to fix manage.py collectstatic command to only upload changed files instead of all files
MEDIA_ROOTとSTATIC_ROOTは、それぞれDEFAULT_FILE_STORAGEとSTATICFILES_STORAGEに置き換えられるため、必要ありません。ただし、MEDIA_URLとSTATIC_URLを次のように設定する必要があります。
STATIC_URL = 'https://bucket-name.s3.amazonaws.com/static/'
ADMIN_MEDIA_PREFIX = 'https://bucket-name.s3.amazonaws.com/static/admin/'
静的ファイルとメディアファイルを異なるサブフォルダーに保存する場合、これは優れたソリューションです:https ://stackoverflow.com/a/10825691/674794
MEDIA_URLとSTATIC_URLをそれぞれの新しいフォルダに設定する必要があります。
MEDIA_URL = 'https://bucket-name.s3.amazonaws.com/media/'
STATIC_URL = 'https://bucket-name.s3.amazonaws.com/static/'
また、manage.py collectstaticを手動で実行し、https: //devcenter.heroku.com/articles/django-assets#disabling_collectstaticに従って、Herokuの自動collectstaticを無効にする必要があります。Herokuのcollectstaticは、毎回すべての静的ファイルをS3に再アップロードするためです。ファイルが変更されていない場合でもプッシュし、S3に大量の転送とリクエストの読み込みを追加して、プッシュの速度を落とします。
次に、通常どおりテンプレートで{{STATIC_URL}}を引き続き使用すると、設定が完了します。
<link href='{{ STATIC_URL }}css/styles.css' type='text/css' rel='stylesheet'>
単純なものから始めて、すぐにそのルートをとらないことを選択したい場合は、HerokuでのCesarの言及された投稿に従うことでURL構成をすばやくハックできます-Djangoアプリで静的ファイルを処理しますが、大幅に減少しますアプリのパフォーマンスで。