DjangoアプリをHerokuにデプロイする方法

Herokuにデプロイすると、開発したDjangoアプリを無料で公開し、簡単に第三者に共有することができます。初心者が自分でオリジナルのアプリを開発する際に、よく利用されます。

講師
講師

Herokuへのデプロイ手順としては、「1.Herokuへの会員登録・ログイン」「2.設定ファイルの作成」「3.設定ファイルの編集」「4.デプロイ作業」の4つに分けられます。それでは早速試してみましょう。

1.Herokuへの会員登録・ログイン

環境: python3.8.10  django3.2.6

1.1.Herokuに会員登録する

Heroku公式サイトにアクセスし、会員登録します。

1.2.Herokuをインストールする

公式サイトから、お使いの環境に合ったものを選びHerokuをインストールします。

1.3.Herokuにログインする

PCでターミナルを起動し、次のコマンドを実行します。

$ heroku login

ブラウザを立ち上げるために次のメッセージが表示される場合がありますので、適当な キー(Enterキーなど)を押下します。

heroku: Press any key to open up the browser to login or q to
exit:

自動的にブラウザが立ち上がり、ログインボタンが表示されるのでクリックします。自動 ログインできない場合は、ログイン情報を入力します。

2.設定ファイルの作成

2.1.仮想環境に入る

Djangoアプリのルートディレクトリに移動し、仮想環境に入ります。

$ source env/bin/activate

2.2.requirements.txtを作成

ルートディレクトリに作成します。作成後、現在の環境でインストールしているパッケージとバージョンを書き込みます。

$ touch requirements.txt
$ pip freeze > requirements.txt

2.3.runtime.txtを作成

python-の後には、使用しているpythonのバージョンを指定します。

$ python --version   // バージョン確認
$ echo python-3.8.10 > runtime.txt 

2.4.Procfileの作成

名前が違うとエラーが出てしまうので、必ず大文字Pから始まる「Procfile」としてください。

$ echo web: gunicorn ディレクトリ名.wsgi --log-file - > Procfile

2.5.local_settings.pyの作成

settings.pyのあるディレクトリに、local_settings.pyを作成します。

$ touch local_settings.py

2.6.dj-database-urlをインストール

$ pip install dj-database-url

2.7.django-herokuをインストール

$ pip install django-heroku

3.設定ファイルの編集

3.1.local_settings.pyを編集する

以下をlocal_settings.pyに追加します。 SECRET_KEYは、settings.pyからコピーして貼り付けてください。

import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
SECRET_KEY = 'settings.pyからコピーしたSECRET_KEYをここに貼り付ける'

#settings.pyからそのままコピー
DATABASES = {
 'default': {
 'ENGINE': 'django.db.backends.sqlite3',
 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
 }
}
DEBUG = True

また、local_settings.pyを.gitignoreファイルでgit管理から外します。.gitignoreファイルをまだ作成してない場合は、アプリのルートディレクトリに作成してください。

myvenv
db.sqlite3
.DS_Store
local_settings.py #追加する

3.2.settings.pyを編集する

ローカルのDebugをlocal_settings.pyでTrueにしたので、本番環境ではFalseになるよう設定します。

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False

ホストにHerokuを追加します。

STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

MIDDLEWAREにwhitenoise.middleware.WhiteNoiseMiddlewareを追加します。 位置に気を付けてください。

MIDDLEWARE = [
 'django.middleware.security.SecurityMiddleware',
 #以下の行(whitenoise...)をdjango.middleware...の後、
 #django.contrib...よりも前に追加する
 'whitenoise.middleware.WhiteNoiseMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

Staticファイルの設定を行います。

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

settings.pyの最後に、以下を追加します。最初にあったSECRET_KEYは削除します。

#Heroku database
import dj_database_url
db_from_env = dj_database_url.config()
DATABASES['default'].update(db_from_env)
db_from_env = dj_database_url.config(conn_max_age=600,
ssl_require=True)
DATABASES['default'].update(db_from_env)
try:
 from .local_settings import *
except ImportError:
 pass
if not DEBUG:
 SECRET_KEY = '***************************************' #削除したSECRET_KEYをコピペします

import django_heroku
django_heroku.settings(locals())

最終的にsettings.pyが以下のようになっていたらOKです。

from pathlib import Path
import os
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False
ALLOWED_HOSTS = ['127.0.0.1' ,'herokuapp.com']
# Application definition
INSTALLED_APPS = [
 'django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'your_app',
]
MIDDLEWARE = [
 'django.middleware.security.SecurityMiddleware',
 'whitenoise.middleware.WhiteNoiseMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'coordinate_yohou.urls'
TEMPLATES = [
 {
 'BACKEND':
'django.template.backends.django.DjangoTemplates',
 'DIRS': [],
 'APP_DIRS': True,
 'OPTIONS': {
 'context_processors': [
 'django.template.context_processors.debug',
 'django.template.context_processors.request',
 'django.contrib.auth.context_processors.auth',

'django.contrib.messages.context_processors.messages',
 ],
 },
 },
]
WSGI_APPLICATION = 'coordinate_yohou.wsgi.application'
# Database
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases
DATABASES = {
 'default': {
 'ENGINE': 'django.db.backends.postgresql_psycopg2',
 'NAME': 'name',
 'USER': 'user',
 'PASSWORD': '',
 'HOST': 'host',
 'PORT': '',
 }
}
# Password validation
# https://docs.djangoproject.com/en/3.2/ref/settings/#authpassword-validators
AUTH_PASSWORD_VALIDATORS = [
 {
 'NAME':
'django.contrib.auth.password_validation.UserAttributeSimilarityVa
lidator',
 },
 {
 'NAME':
'django.contrib.auth.password_validation.MinimumLengthValidator',
 },
 {
 'NAME':
'django.contrib.auth.password_validation.CommonPasswordValidator',
 },
 {
 'NAME':
'django.contrib.auth.password_validation.NumericPasswordValidator'
,
 },
]
# Internationalization
# https://docs.djangoproject.com/en/3.2/topics/i18n/
LANGUAGE_CODE = 'ja'
TIME_ZONE = 'Asia/Tokyo'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.2/howto/static-files/
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATIC_URL = '/static/'
STATICFILES_DIRS = (
 os.path.join(BASE_DIR, 'static'),
)
# Default primary key field type
# https://docs.djangoproject.com/en/3.2/ref/settings/#defaultauto-field
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
#Heroku database
import dj_database_url
db_from_env = dj_database_url.config()
DATABASES['default'].update(db_from_env)
db_from_env = dj_database_url.config(conn_max_age=600,
ssl_require=True)
DATABASES['default'].update(db_from_env)
try:
 from .local_settings import *
except ImportError:
 pass
if not DEBUG:
 SECRET_KEY = '**********************************************'
 import django_heroku
 django_heroku.settings(locals())

4.デプロイ作業

4.1.git add、git commitする

ターミナルを起動して、Djangoアプリのルートディレクトリに移動し、仮想環境に入った状態で以下を実行します。Gitの設定をしてない場合は、先に設定を済ませてください。

$ git add .
$ git commit -m "deploy heroku"

4.2.Herokuのプロジェクトを作成する

$ heroku create プロジェクト名

4.3.SECRET_KEYをHerokuに設定

$ heroku config:set SECRET_KEY='settings.pyに記載されていた SECRET_KEY'

4.4.Herokuにpushする

$ git push heroku master

4.5.Dynoを起動する

$ heroku ps:scale web=1

4.6.データベースの設定をする

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

4.7.アプリを開く

$ heroku open

自動でブラウザが開き、開発したDjangoアプリが表示されていたらデプロイ完了です。

Startlabのプログラミング入門コースは、Python未経験者・初学者にもわかりやすいカリキュラムと続けやすいサポート体制が魅力。自分の学習目的に合っているか、どういった知識を身に付けることができるのかなど、無料カウンセリングでぜひご相談ください!カウンセリングは毎日実施中、お待ちしております!

無料カウンセリングを予約する