dassimen.log

サーバーサイドエンジニア脱脂綿のログ。

Djangoで作ったポートフォリオをHerokuで動かそうとしたら行き詰まったポイントまとめ

最初に

1月頭からポートフォリオサイトを作っていました。Django製。

dassimen-portfolio.herokuapp.com

本名とか顔バレとか今更気にしない。

Djangoの機能をフルに活用した気持ちはあんまりしないのでまだまだなのですが、それなりに苦戦したので、それらの知見をまとめてみようと思います。

デプロイしても動かない

DjangoGirls始め、DjangoをHerokuにデプロイする方法は世の中に幾つか出ていますが、各情報で書いてある事が違いすぎます。特にWhitenoise周りの設定とか書いてる事違いすぎて発狂しそうですね?

少なくともDjango 2.1.5をお使いの方は、以下に纏まっている手順を順番に実施しましょう。
https://www.djangobrothers.com/blogs/heroku_django_deploy/

その後、settings.pyを開いてALLOWED_HOSTSを変更してください。
こちらは公式ドキュメントにて、Debug=Falseの時はALLOWED_HOSTSの値を以下のようにせよとの記述があります。

When DEBUG is True and ALLOWED_HOSTS is empty, the host is validated against ['localhost', '127.0.0.1', '[::1]'].

ここまでやっても、Debug=Falseの時に最初のロケットが飛ぶスタートページが表示されない事でデプロイに失敗したと思われる方もいるかと思います。私自身そうでした。

何か適当なindexページを実装してみてherokuにデプロイしてみれば、indexページが表示されますので、お試しください。

ロケットのページが表示されない理由については、この時相談に載ってくれた @tetsunosukeさんが記事にしてくれました!

qiita.com

画像(ファイル)がアップロードできない

ImageFieldを使って、Django Model経由で画像やファイルをアップロードする機能を実装されようとしていますか?

これはDjangoに限らないのですが、Herokuの仕様でHerokuだけではそういった機能は実装できないようです。
実際には実装はできるのですが使い物にならない、というのが正しい。

Herokuのファイルストレージはデプロイされた状態を維持するような仕様になっています。
これにより、アップロードされた画像が保持されないという問題が発生します。

AWS S3やDropboxといった外部ストレージを別途用意してアップロード先にすることで解決するようなのですが、自分は上手く設定できなかったのでImageFieldの使用は諦めました。

急に500で落ちるようになる

Djangoのデプロイに成功して機能追加を繰り返していった時、あるタイミングで急にheroku環境でのみ500が発生するようになりました。
ローカルでは再現しないため環境変数周りか、本番用のsettings.pyを疑ったのですが、どうにも見つけることができませんでした。
少なくともコードを一切変更せず、Herokuで別環境を立ててpushすると動いたので、環境変数或いはライブラリの問題であった可能性が高いです。
同じような事象が発生して調べても調べても解決が無ければ、別環境に改めてデプロイし直すのも手という話。

まとめ

  • デプロイするための情報はある程度一箇所に集まっているよ
  • Heroku(だけ)で画像アップロード機能は実装できないよ
  • DjangoアプリをHerokuにデプロイすると謎に動かなくなる時があるよ ちなみにデプロイし直すと治るからソースじゃないよ