【記録用】Djangoアプリのherokuでのアップロード

# herokuにDjangoをアップロードする流れ
記録用です。
djangogirlsをもとに作っています。

URL: https://djangogirlsjapan.gitbooks.io/workshop_tutorialjp/

＊Herokuアカウント作成済み
＊仮想環境作成済み
＊djangoプロジェクト作成済み

Windows10です

# 必要なファイルのインストール
djangogirlsの「デプロイ！」のところだけを見ると、psycopg2をインストールするタイミングがなかったので、ここでインストール。
（ほかの章でインストールしてるのかな？）

```
$ pip install dj-database-url gunicorn whitenoise psycopg2
```

# requirements.txtの作成

```
$ pip freeze > requirements.txt
```

で、requirements.txtファイルを作成します。heroku上でインストールするソフトウェアの認識させています。
ちなみに中身は

```
dj-database-url==0.5.0                                                     
Django==2.0.6                                                              
gunicorn==19.8.1                                                           
psycopg2==2.7.5                                                            
pytz==2018.4                                                             
whitenoise==3.3.1
```

になってます。アプリで使うソフトウェアが増えたときは、ローカルでインストールしたあと、もう一度

```
$ pip freeze > requirements.txt
```

を行うことで、requirements.txtの中身が書き換わり、git pushすると自動的にソフトがHeroku上にインストールされます。

#Procfileの作成
requirements.txtと同じディレクトリに、Procfileという名前のファイルを作成し、中身を

```
web: gunicorn mysite.wsgi
```

「mysite」のところは自分のプロジェクト名にします。
アプリを動かすファイル？を指定しているみたいです。

# runtime.txtの作成

Procfileのディレクトリと同じところに、runtime.txtファイルを作成し、中身を

```
python-3.6.5
```

とします。このPythonのバージョンは、自分が使っているPythonのバージョンを記載しますが、Pythonが最新のバージョンじゃないとherokuはサポートしていないという記述がコンソール上で出たことがあるので、最新版にアップデートしておくことが好ましいかと思います。

# local_settings.pyの追加
プロジェクトディレクトリ下（デフォルトのsettings.pyと同じところ）に、local_settings.pyを作成し、中身に

```py
import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

DEBUG = True
```

と記述します。これは、herokuとローカルで使うデータベースが違うため、ローカルでの設定を保存しておくためみたいです。

# settings.pyに追記
settings.pyの最終行に、

```py
import dj_database_url
DATABASES['default'] = dj_database_url.config()

SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

ALLOWED_HOSTS = ['*']

STATIC_ROOT = 'staticfiles'

DEBUG = False

try:
    from .local_settings import *
except ImportError:
    pass
```

を追加します。これは、herokuやローカル上での動作に必要な設定みたいです。

# wsgi.pyに追加


```py
from whitenoise.django import DjangoWhiteNoise
application = DjangoWhiteNoise(application)
```

をwsgi.pyの最終行に追加します。意味は分かりません。わかる方いたら教えてください。

# herokuにログインします

```
heroku login
```

でコンソール上で、herokuにログインします。emailとpasswordの入力を求められるかと思います。

# .gitignoreを作成します

これで、ファイルの作成は最後です。gitがlocal_settings.py等をアップロードしないように、指定します。「.gitignore」というファイルを作成し、中に

```
myenv
__pycache__
staticfiles
local_settings.py
db.sqlite3
*.py[co]
```

と記述します。myenvとは、その時使っている仮想環境名です。（タイプミスでmyvenvと打ててなかったので、djangogirlsから修正しています）

# コンソールでgitを使いアップデート
gitのコミットまで行います。
ここは、通常のgitの使い方と違いはありません。

```
$ git init
$ git config user.name "Your Name"
$ git config user.email you@example.com
$ git add -A .
$ git commit -m "My app"
```

heroku上にアプリケーションを作成します。

```
heroku create appname
```

「appname」は自分の好きなアプリの名前を入力してください。他のアプリとかぶっている名前や、アンダーバーを含んだ名前は使えません。アプリの名前はいつでも

```
$ heroku apps:rename the-new-name
```

で変更できます。

```
$ git push heroku master
$ heroku ps:scale web=1
```

で、ソースコードをherokuにpushします。
下のコードで、herokuのwebプロセスを起動しているみたいです。web=1は起動するwebプロセスの数を指定していて、多いほどパワーが上がるみたいですが、無料では1つしか使えないそうです。

```
$ heroku open
```

で自分のアプリを開けます。

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

を行うことで、heroku上のデータベースが作成され、管理者ページ（/admin)にアクセスできるようになります。

#所感
最初のpsycopg2以外特につまるところはありませんでした。Djangoの中身を書き込んでまた詰まったりしたら、記録を残そうと思います。