Heroku で Django の静的ファイルとテンプレートを適切に処理する方法 質問する

Heroku で Django の静的ファイルとテンプレートを適切に処理する方法 質問する

Django アプリを Heroku に移行しているのですが、静的ファイルの適切な処理方法が知りたいです。Git 経由で Heroku にプッシュするだけですか? それとも SW3 か何かに保存するべきでしょうか? また、STATIC_ROOT などはどうすればよいでしょうか?

ありがとう!

ベストアンサー1

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を手動で実行し、Herokuの自動collectstaticを無効にすることもできます。https://devcenter.heroku.com/articles/django-assets#disabling_collectstaticHeroku の collectstatic は、ファイルが変更されていない場合でも、プッシュするたびにすべての静的ファイルを S3 に再アップロードするため、S3 への転送とリクエストの負荷が大きくなり、プッシュが遅くなります。

その後は、通常どおりテンプレートで {{ STATIC_URL }} を使い続けるだけで設定は完了です。

<link href='{{ STATIC_URL }}css/styles.css' type='text/css' rel='stylesheet'>

シンプルに始めたいという場合、すぐにそのルートを取らないことを選択する場合は、Cesarの投稿に従ってURL構成で簡単なハックを行うことができます。Heroku - Django アプリで静的ファイルを処理するただし、アプリのパフォーマンスは大幅に低下します。

おすすめ記事