djangoをherokuへデプロイする（備忘録）

#準備
##インストールとかが必要なやつ
python3.6.5
django-toolbelt0.0.1
Django2.1.3
gunicorn19.9.0
git2.14.3
※2019/03/06に確認したらこの環境だった。

##環境作り
開発環境を作る

```terminal
mkdir directoryname	#作業ディレクトリ
cd directoryname
django-admin startproject projectname	#プロジェクトディレクトリが作業ディレクトリ内に作られる。
```

アプリ開発環境を作る

```terminal
cd projectname
python3 manage.py startapp appname	#アプリディレクトがプロジェクトディレクトリ内に作られる。
```

#htmlを表示するアプリを作る
##編集などなど
projectname/projectname/setting.pyを編集する

```setting.py
# Application definition

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'appname', #追記
)

〜〜〜〜〜

LANGUAGE_CODE = 'ja'     #変更

TIME_ZONE = 'Asia/Tokyo'    #変更

USE_I18N = True

USE_L10N = True

USE_TZ = False              #変更
```

projectname/projectname/urls.pyを編集する。

```urls.py
from django.contrib import admin
from django.urls import include, path

urlpatterns = [
   path(r'admin/', admin.site.urls),
   path('', include('appname.urls')),
]
```

projectname/appname直下に、
urls.pyファイルとtemplatesディレクトリを作成し、
templatesディレクトリ内にindex.htmlを作成する。

```terminal
touch urls.py
mkdir templates
touch index.html
```

projectname/appname/urls.pyを編集する。

```urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
]
```

projectname/appname/views.pyを編集する。

```views.py
from django.shortcuts import render

# Create your views here.
def index(request):    #追記
    return render(request, "index.html")
```

index.htmlの中身はこんな感じ。

```index.html
<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
    Hello, Heroku!!
  </body>
</html>
```

以下コマンドを実行し、
ブラウザ上でHello, Heroku!!が表示されたらひとまずDjangoは完了。

```
python3 manage.py runserver
```

#Herokuへデプロイ
##準備
Procfileを作成する。

```terminal
echo "web: gunicorn projectname.wsgi --log-file -" > Procfile
```

runtime.txtを作成する。

```terminal
echo "python-3.6.5" > runtime.txt
```

requirements.txtを作成する。
これもいいけど、

```terminal
pip freeze > requirements.txt
```

グローバル環境で開発していたのでgit push時に余計なエラーが多発・・・
必要なものだけ手入力した。

```requirements.txt
dj-database-url==0.4.2
dj-static==0.0.6
django-toolbelt==0.0.1
Django==2.1.3
gunicorn==19.9.0
```

##Djangoアプリを編集する
setting.pyを修正する。

```setting.py
#BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))     変更前
BASE_DIR = os.path.dirname(os.path.abspath(__file__))	#変更後

#ALLOWED_HOSTS = [] 変更前
ALLOWED_HOSTS = ['*']   #変更後

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.8/howto/static-files/

STATIC_URL = '/static/'
STATIC_ROOT = "staticfiles"     #追記
STATICFILES_DIRS = (os.path.join(BASE_DIR, "static"),)  #追記

### 以下追記 ###
# Parse database configuration from $DATABASE_URL
import dj_database_url
db_from_env = dj_database_url.config()
DATABASES['default'].update(db_from_env)

# Honor the 'X-Forwarded-Proto' header for request.is_secure()
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
```


wsgi.pyを下記に変更する。

```wsgi.py
import os

from dj_static import Cling
from django.core.wsgi import get_wsgi_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "projectname.settings")

application = Cling(get_wsgi_application())
```

#デプロイ！
##Herokuアプリを作成する
herokuへログインし、herokuアプリを作成する。
なお、「heroku create herokuAppName」のようにすると、
「herokuAppName」がherokuでのアプリ名になる。
「heroku create」のみだと自動でアプリ名が決められる。

```terminal
heroku login	#この時ブラウザでログインが求められるかも
heroku create
```

Heroku環境変数の設定が必要らしい。

```terminal
heroku config:set DISABLE_COLLECTSTATIC=1
```

##gitと連携
gitと連携させる。

```terminal
git init
heroku git:remote -a herokuでのアプリ名
```

##gitへpush!push!push!

```terminal
git add .
git commit -am "なんかコメント"
git push heroku master
```

「remote: Verifying deploy... done.」と表示されたら成功。
確認してみる。

```terminal
heroku open
```

失敗していたら、「heroku logs --tail」でひたすら調べる。