Django:Herokuにデプロイするまで - Qiita
基本的にはこちらの記事に従っていけばオーケーだが、所々ハマったところがあったので補足していきます。
staticファイル関係
#settings.py
#collectstaticでstaticファイルが集められる場所
STATIC_ROOT = 'staticfiles'
#参照用パス
STATIC_URL = '/static/'
#app/static以外の場所においたstaticディレクトリを指定する
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)
#ターミナルで
$ heroku config:set DISABLE_COLLECTSTATIC=1
このように設定して、さらにルートにstaticfilesフォルダをつくりstaticファイルをコピーしておく。
よくわからないがこれでうまくいった。
また以下のファイル内の記述を消しておく。
whitenoiseのストレージ機能?を使うと本番のDEBUG=False
環境で自分はエラーが出た。
#.gitignore
staticfiles
#settings.py
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
アップロードファイルをDropboxにストレージ
django-storages
herokuではあらゆるアップロードしたファイルをherokuサーバに保存することを許していないので、オンラインの違う場所にストレージする必要があります。
これのための便利なパッケージとしてdjango-storagesというものがあり、ほぼこれ一択でしょう。
django-storagesはAmazon S3やGoogle Cloud Storage、Dropboxなどいくつかのストレージサービスに対応していますが、自分はAWSを使ったことがないし料金体系もよくわからなかったので今回はDropboxを使うことにしました。
Dropboxでは難あり
ただ問題があって、django-storagesは現在のところ(ver1.6.5)最新のDropboxAPIに対応できてません。
正しく設定したあとファイルをDropbox上にファイルをアップロードしようとすると下のようなエラーが出ると思います。
TypeError: expected request_binary as binary type, got <class 'django.core.files.uploadedfile.InMemoryUploadedFile'>
これを解決するのにけっこう苦労しました。
結論から言うと、このバグを見つけた人が修正してプルリクエストを出してくれています。管理者がまだ承認していないようなので問題があるのかもしれませんが今回はこれを個人的にもってきて使います。
Dropbox 8.x support by danni · Pull Request #402
一言でこれをつかうといっても、またこれがめんどくさくて、なにぶんGit自体このサイトを作り始めてから触れたのでイチから調べました。
プルリクエストをもってきてherokuにインストール
herokuでは必要なパッケージのインストールにrequirements.txtを使っていて、このなかにパッケージ情報を書き込みます。
ただdjango-storages==1.6.5
としてはオフィシャルがインストールされてしまうので、ローカルにプルリクエストされたブランチを展開しておいてto/path/django-storages
と、setup.pyを含むディレクトリを指定してやればいいです。
pushするリポジトリに別のリポジトリを含ませるときにはただ単にコピーするとやばいらしいので、gitのsubmoduleをつかいます。
参考:【Git】他人のプロジェクトをsubmoduleで追加し、Pull Requestを自分でマージする方法
submoduleでオフィシャルのリポジトリをもってきてプルリクをfetchするだけではherokuがインストールするときにエラーを返します。なので自分のリポジトリにフォークしてブランチにしてしまいます。
あらかじめ自分のgithubリポジトリにdjango-storagesをフォークしておく
$ cd 作業用フォルダ
$ git clone フォークしたリポジトリ
$ cd django-storages
$ git remote add official https://github.com/jschneier/django-storages.git
$ git fetch official pull/402/head:dropbox_8.x_support
$ git checkout -b dropbox
$ git merge official/dropbox_8.x_support
$ git push origin dropbox
これで自分のリポジトリに目当てのdropboxというブランチを追加できます。
そしたら今度はsubmoduleです。
$ cd プロジェクトのルート
$ git submodule add 自分のリポジトリ django-storages
$ cd django-storages
$ git checkout dropbox
$ cd ..
$ git add django-storages
$ git commit -m "add submodule custom django-storages"
これでsubmoduleも作成できました。
あとはさっき言ったとおりrequirements.txtに追加します。
#これを追加
./django-storages
herokuにpushすれば無事、django-storagesがインストールできると思います。
ファイルをアップロードしても今度はエラーを吐きません!
あー疲れたw
おわり
とりあえずめっちゃ詰まったとこはこのくらいです。
特にdjango-storagesのくだりは、Dropboxを使う人が少ないからなのか、このエラーに対する情報が少なかったように思ったのでまとめてみました。
ただ自分はまだド素人に毛が生えた程度なので、もしかしたら全然無駄なことをしてるかもしれませんw
そのへんあしからず!