【Python】Heroku×Django デプロイ方法

　本でDjangoの勉強をしていて、実際にサーバー上で動かしたかったので、Herokuにdeployしました。その際に、躓いた点があったので、記録します。</p>

<h2>Herokuで動作させたい環境</h2>

Django 2.2.5

<h2>躓いた点</h2>

<h3>1.「No default language 」エラー</h3>

　git pushコマンド実行後、以下のようなエラーが表示されました。


```bash
No default language could be detected for this app.
```

　これはHerokuで作ったアプリで動作させるプログラミング言語が設定されていないために表示されるようです。今回はPythonを使用しているので、以下のコマンドで設定を行います。

```bash
ryuki@ryuki MINGW64 ~/Desktop/django_app (master)$ heroku buildpacks:set heroku/python
Buildpack set. Next release on thawing-waters-78052 will use heroku/python.
Run git push heroku master to create a new release using this buildpack.
```


　或いはブラウザ上でも設定でき、Herokuのマイページを開き、「Personal」→「アプリの詳細画面」→「Settings」のadd buildpackでPythonを選択するのでも、設定可能です。


<h3>2.「App not compatible with buildpack」エラー</h3>

　No default languageをクリアしたと思い、pushしたら次に以下のようなエラーが表示されました。

```bash
App not compatible with buildpack: https://buildpack-registry.s3.amazonaws.com/buildpacks/heroku/python.tgz
```

　これを解消するのに以下のことを行います。

  まず、デプロイするアプリ内にProcfileを作成します。内容は以下の一文とし、myprojectの部分は自分のフォルダ名に変えます。

```bash
web: gunicorn myproject.wsgi
```

　次に、ローカルの開発環境内で以下のパッケージをインストールし、それをrequirements.txtファイルに書き出します。以下のコマンドを実行します。


```bash
pip install gunicorn
```


```bash
pip install django-heroku
```


```bash
pip freeze > requirements.txt
```


　また、以下のコードをsettings.pyの最後に追加します。


```python
import django_heroku
# Activate Django-Heroku.
django_heroku.settings(locals())
```

　以上が完了次第、デプロイすると、正常に動作するはずです。<br>　また、ここでCSSファイルが反映されていない場合は3.を参考にして頂ければ幸いです。私の場合は、1回目のデプロイでstaticが反映されていないので3.まで進んだのですが、2回目の別のドメインでのデプロイでは2.まで行っただけで、staticが反映されていました。この辺は分かりません。</p>

<h3>3.staicファイルが反映されない。</h3>

　1回目にデプロイしたときは反映されなかったのに、2回目ブログ用にデプロイしたときは、何も対策なく反映されたので、この辺よくわかりませんが、一応1回目に行った対策をまとめておきます。

　まず、以下のパッケージをローカルでインストールし、これをrequirements.txtに書き込みます。

　次に、settings.pyに以下を追加します。


```python
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
# 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'),
)
```


　また、 settings.pyのMIDDLEWARE&nbsp;に以下を追加します。</p>

```
'whitenoise.middleware.WhiteNoiseMiddleware',
```

　最後に、以下を実行して、pushします。

```bash
$heroku config:set DISABLE_COLLECTSTATIC=1
```

　以上でDjangoで作成したアプリがstaticも含めて動作するようになりました。</p>


<h2>データベース設定方法</h2>


　まず、heroku側でデータベースの準備を行うために以下を実行します。

```bash
$ heroku addons:create heroku-postgresql:hobby-dev
```

　次に、マイグレーションファイルを作ります。ローカル環境で作成してもherokuにpushした後でも良いですが、ここでは、ローカル環境で作成しています。以下のコマンドを実行します。

```bash
$python manage.py makemigrations アプリ名
```


　続いて、heroku側でマイグレーションを実行します。これは、作成したマイグレーションファイルを適用してデータベースを更新します。

```bash
$heroku run python manage.py migrate
```

　以上で、Herokuのデータベースで指定のテーブルを利用できるようになります。

　最後にデータベースの管理者を登録します。以下のコマンドを実行し、ユーザ名、メールアドレス、パスワードを設定します。


```bash
$ heroku run python manage.py createsuperuser
```

　以上でデータベースの設定は完了です。


<h2>参考サイト</h2>


* Configuring Django Apps for Heroku | Heroku Dev Center
https://devcenter.heroku.com/articles/django-app-configuration

* Django and Static Assets | Heroku Dev Center
https://devcenter.heroku.com/articles/django-assets</a>