2
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-09-28

概要

DjangoアプリをHerokuにデプロイした際の手順をまとめました。

環境:python3.8.10 django3.2.6

1. Herokuにサインアップ・ログイン編

1.1 Herokuにサインアップする

Heroku公式サイトから、サインアップします。

1.2 Herokuをインストールする

Heroku公式サイトから、お使いの環境に合ったものを選びHerokuをインストールします。
スクリーンショット 2021-09-09 112055.png

1.3 Herokuにログインする

PCでコマンドプロンプトを起動し、herokuにログインします。

$ heroku login

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

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

自動的にブラウザが立ち上がり、ログインボタンが出てくるので押下します。

2. ファイル作成編

2.1 仮想環境に入る

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

$ cd foo
$ Scripts\activate          #仮想環境に入る

2.2 requirements.txtの作成

以下のコマンドで、requirements.txtを作成します。

$ pip freeze > requirements.txt

2.3 runtime.txtの作成

runtime.txtを作成します。python-の後に、使用しているpythonのバージョンを記載します。

$ python --version                       #pythonのバージョンを確認するコマンド
$ echo python-3.8.10 > runtime.txt          

2.4 Procfileの作成

以下のコマンドで、Procfileを作成します。
名前が違うとエラーが出てしまうので、必ず大文字Pから始まる「Procfile」としてください。
settings.pywsgi.pyと同じディレクトリに作成します。

$ 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からコピーして貼り付けてください。

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

SECRET_KEY = 'settings.pyからコピーしたSECRET_KEYをここに貼り付ける' 

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.pyTrueにしたので、本番環境ではFalseになるよう設定します。

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

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

settings.py
ALLOWED_HOSTS = ['127.0.0.1' ,'herokuapp.com']

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

settings.py
#CSSを反映させる
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ファイルの設定を行います。

settings.py
#CSSファイルの設定
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATIC_URL = '/static/'
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
)

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

settings.py
#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です。DATABASEは初期状態にします。

settings.py
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/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        '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/#default-auto-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する

以下のコマンドを実行して、Git管理をします。

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

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

$ heroku create プロジェクト名

上記のコマンドが問題なく実行されると、以下のように終わります。

creating プロジェクト名... done

4.3 SECRET_KEYをHerokuに設定

$ heroku config:set SECRET_KEY='settings.pyのSECRET_KEY'

4.4 Herokuにプッシュする

$ git push heroku master

4.5 Dynoを起動させる

$ heroku ps:scale web=1

4.6 データベースの設定

createsuperuserで作成したユーザー名・パスワードはメモしておきます。

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

4.7 アプリを開く

$ heroku open

自動でブラウザが開き、Djangoアプリが表示されていたら成功です!!!

参考にしたサイト

https://tutorial-extensions.djangogirls.org/ja/heroku
https://devcenter.heroku.com/articles/getting-started-with-python#deploy-the-app

2
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?