6
10

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 3 years have passed since last update.

HerokuでDjangoのWebサービスを公開する流れ

Last updated at Posted at 2021-06-25

爆速で環境準備

ディレクトリ作成

Djangoのプロジェクトを作るための、ディレクトリを作成します。

terminal
$ mkdir testproject
$ cd testproject

仮想環境を立ててDjangoをインストール

Python3.6以上であれば、Pythonコマンドで仮想環境を作ることができます。今回はvenvという仮想環境を作ります。

terminal
$ python -m venv venv
$ source venv/bin/activate
$ pip install django
$ django-admin version

※Windowsの方はsource venv/bin/activateではなく、source venv/Scripts/activateで実行してみてください。

プロジェクト作成

Djangoのバージョンを確認できたら、プロジェクトを作成します。

terminal
$ django-admin startproject testproject
$ cd testproject
$ python manage.py startapp testapp

testappのフォルダがある階層に、フォルダを2つ、ファイルを1つづつ仮で作成もしておきます。

terminal
$ mkdir static
$ cd static
$ touch style.css
$ cd ../
$ mkdir templates
$ cd templates
$ touch index.html

ディレクトリ構造

testproject
├── db.sqlite3
├── manage.py
├── static
│   └── style.css
├── templates
│   ├── index.html
├── testapp
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   ├── models.py
│   ├── tests.py
│   ├── urls.py
│   └── views.py
└── testproject
    ├── local_settings.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

Heroku インストール

terminal
$ brew tap heroku/brew && brew install heroku

Windowsの方はこちら
https://devcenter.heroku.com/articles/heroku-cli#download-and-install

続いて、下記のコマンドでHerokuでDjangoを使うために必要なモジュールをインストールします。

terminal
$ pip install gunicorn whitenoise django-heroku dj-database-url

heroku起動に必要なファイルの作成

terminal
$ echo web: gunicorn testproject.wsgi --log-file - > Procfile
$ pip freeze > requirements.txt
$ python -V

Pythonのバージョンが出てくるので、それを記載します。

terminal
$ echo python-3.8.8 > runtime.txt

Gitで管理しないファイルを指定します。(.gitignore)

terminal
$ echo -e __pycache__\\ndb.sqlite3\\n.DS_Store\\nlocal_settings.py > .gitignore

local_settings.pysettings.pyと同じディレクトリに作成し、下記のように追加します。

local_settings.py
import os

#settings.pyからそのままコピー
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent.parent

SECRET_KEY = '**************************' # settings.py から該当部分コピー

#settings.pyからそのままコピー
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

DEBUG = True

その他の編集すべきファイルを下記のように変更します。

settings.py
"""
Django settings for testproject project.

Generated by 'django-admin startproject' using Django 3.2.3.

For more information on this file, see
https://docs.djangoproject.com/en/3.2/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/3.2/ref/settings/
"""

from pathlib import Path
import dj_database_url
import os

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent

# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
# SECRET_KEY = 'django-insecure-w3v(******************)@**********************

# 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',
    'testapp' # 追加部分
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    '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',
    'whitenoise.middleware.WhiteNoiseMiddleware', # 追加部分
]

ROOT_URLCONF = 'testproject.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 = 'testproject.wsgi.application'


# Database
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases

# DATABASES = {
#     'default': {
#         'ENGINE': 'django.db.backends.sqlite3',
#         'NAME': BASE_DIR / 'db.sqlite3',
#     }
# }

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_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

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'

try:
    from .local_settings import *
except ImportError:
    pass

if not DEBUG:
    SECRET_KEY = os.environ['SECRET_KEY']
    import django_heroku
    django_heroku.settings(locals())

db_from_env = dj_database_url.config(conn_max_age=600, ssl_require=True)
DATABASES['default'].update(db_from_env)

Herokuにアップロード

まず、herokuに新規登録を済ませておいてください。
https://heroku.com

terminal
$ git init
$ git add -A
$ git commit -m "initial commit"
$ heroku login
$ heroku create <***herokuプロジェクト***>

settings.pyにあったSECRET_KEY`を記入します。

terminal
$ heroku config:set SECRET_KEY='**************************'
$ git push heroku master
$ heroku ps:scale web=1

最後に、マイグレーションして、herokuを起動します。

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

YouTube : DjangoでLINEチャットボット開発
YouTube : HerokuでDjangoのサWebービスを公開

6
10
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
6
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?