今回は、DjangoアプリケーションをHerokuにデプロイする際につまづいたことの備忘録です。
本番環境用にDebugをFalseにすると、CSSなどの静的ファイルが配信されない問題について解決方法をまとめます。
結論としては、「django-heroku」というデプロイ用パッケージの設定ではうまくいかなかったため、静的ファイルにかかわる部分のみオーバーライドしたら解決しました。
Herokuへのデプロイって、毎回何かめんどくさいポイントでハマる気がします…。
完全に無料で動かせるというメリットさえなければほかのクラウドとか使いたいんだけどなぁ笑
そういえば、Djangoは初心者だよ、って方は先にこちらの動画教材を見ておくといいかもしれません。
日本ではDjangoの入門向け教材はあんまり多くないのですが、こちらは体系的かつわかりやすい構成なのでおすすめです。
もくじDjangoアプリケーションのHerokuデプロイ
まずそもそもDjangoアプリケーションをHerokuにデプロイする方法は、公式が推奨している方法がありますので、そちらについてまとめておきます。
ドキュメントはこちら。
Deploying Python and Django Apps on Heroku
公式では、静的ドキュメントの配信に関して以下の設定を推奨してます。
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/1.9/howto/static-files/ STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') STATIC_URL = '/static/' # Extra places for collectstatic to find static files. STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'static'), )
何の設定だって感じですが、要は静的ファイル配信用の静的ファイルディレクトリの設定です。
Djangoはデフォルトの設定では、本番環境で静的ファイルを配信してくれません。
そこで、設定した静的ファイルディレクトリに静的ファイルをコレクションすることで、Whitenoiseを用いた配信を行っています。
とてもわかりやすいアーキテクチャ図が下記記事に上がってたので貼っておきます。
[Django] Heroku デプロイ方法 2018年版

HerokuへのDjangoアプリケーションのデプロイは、Herokuの公式が出してるdjango-herokuというデプロイ用パッケージを使うと便利です。
どのくらい便利かというと、Herokuデプロイのために追記する必要のある設定がこのたったの2行で済んでしまうくらい便利です。
import django_heroku django_heroku.settings(locals())
設定項目は以下のとおりです。
・databases
・test_runner
・staticfiles
・allowed_hosts
・logging
・secret_key
詳細はこちらのソースを見るとわかります。
公式ドキュメントの手順でできない問題
ここまで書いたところであれですが、僕の環境では公式の手順ではうまくいきませんでした。
Deploying Python and Django Apps on Heroku
ドキュメントの内容が古いのか、僕の環境が悪いのか…。
django-herokuを使っても静的ファイルの配信ができなかったので大変困りました。
この際、django-herokuの静的ファイルに関する設定を無効にして、自分で書きなおしたら解決しました。
django-herokuは引数で該当の項目の値をFalseにしてあげると設定が無効になります。
例えば静的ファイルに関する設定を無効にするならこんな感じ。
django_heroku.settings(locals(), staticfiles=False)
修正部のコードはこちら。
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/1.9/howto/static-files/ STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') STATIC_URL = '/static/' django_heroku.settings(locals(), staticfiles=False)
まとめ
結局何が原因でドキュメント通りにいかなかったのか不明なままですが、何とか解決しました。
ネットにある情報では全く解決できず、django-herokuのソースを読んでようやく思いついた苦肉の策ではありますが、解決してよかったです。
もしかしたら同様の事象に悩む方もいるかと思い記事にしました。
Djangoはもうちょい使い込んで理解を深めていきたいなと思います。