herokuでdjangoアプリを動かす

やりたいこと

無料枠のサーバーで作ったWebアプリを動かしたい。

サーバーにはherokuを使用する。

Webアプリのフレームワークはdjangoとする。

統合開発環境

Visual Studio2019を使用する。

VisualStudioを起動し、メニューバーから

【ファイル -> 新規作成 -> プロジェクト」】でVisualStudioプロジェクトを作成する。

【 Python -> Web -> Blank Django Web Project 】 でDjangoプロジェクトを作成する

実行ボタンをクリックして、実際に動かしてみます。

ブラウザが起動して以下のように起動が成功していることがわかります。

言語・タイムゾーンの設定

settings.pyの言語と タイムゾーンを日本にします(必須ではありません。)

LANGUAGE_CODE = 'ja'
TIME_ZONE = 'Asia/Tokyo'

必要なライブラリ

herokuでdjangoアプリを動かすために必要なライブラリは以下です。

  • dj-database-url
  • gunicorn
  • whitenoise
  • psycopg2
  • pytz

入っていない場合は、GUI操作で追加します

dj-database-url gunicorn whitenoise psycopg2 pytz

DBインストール

Herokuの管理画面からadd-onを追加します。

settings.pyに上記の設定情報を転記します。

設定ファイルの 編集

赤字のファイルを追加します

__init__.pyモジュールの初期化
ProcfileHerokuプロセスの起動コマンド
requirements.txt依存パッケージのリスト
runtime.txtPythonのバージョン指定
settings.py設定
urls.pyURLとWebページを紐付ける
wsgi.py

requirements.txtは次のコマンドで作ることができます。

pip freeze > requirements.txt

pipコマンドを実行するPowerShellは以下の画面で開くことができます。一覧を出したいPython環境を選択して、【PowerShellで開く】をクリックします。

Procfile

reqgipのところはプロジェクト名に合わせて変更します。

web: gunicorn reqgip.wsgi --log-file log.txt
heroku ps:scale web=1

runtime.txt

Pythonのバージョンはお使いのPythonのバージョンに変更してください。

python-3.7.3

DB設定

Heroku上ではpostgresqlを使います。

デフォルトのローカルはsqliteです。

そこで使用するDBを切り替える処理を実装します。

基本的にはsettings.pyの設定を使います。

ローカルで変更したいところのみsetings_local.pyに記載して上書きします。

本番環境(heroku)にはsettings_local.pyはプッシュしません。これによって上書きしないので本番環境になります。

ローカル環境sqlite3settings.pyとsettings_local.pyを使用する
Herokupostgresql settings.pyのみ使用する

settings.py

# 上の方にあるDEBUG = Trueを書き換える
# 許可するHost情報もHerokuにあわせて書き換える
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False

ALLOWED_HOSTS = ['127.0.0.1', '.herokuapp.com']
・・・
いろいろな設定
・・・
# 最後に以下を追加する
try:
    from .settings_local import *
except ImportError:
    pass

settings_local.py

基本的には上記のsettings.pyの設定を使います。ローカル環境で書き換えたいところのみsettings_local.pyで上書きします。参考までにsettings_local.pyの全ソースコードを示します。

import os

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

ALLOWED_HOSTS = ['localhost']

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

DEBUG = True #ローカルでDebugできるようになります

DB作成

現状ではApplication errorがおこります。これは、Herokuにデプロイしたときにデータベースが新規作成され、それが空であるために起こっています。


manage.pyが存在するフォルダに移動してコマンドを実行します。

appnameはheroku上でのアプリ名を指定してください。

$ cd VisualStudio2019\reqgip
$ heroku run python manage.py migrate -a appname
$ heroku run python manage.py createsuperuser -a appname

上記のコマンドを途中で強制終了するなどした時にはプロセスが残ってしまい、再度の実行ができなくなることがあります。

そこで起動しているプロセスを調べるには以下を実行します。appnameはHerokuアプリ名に置き換えてください。

heroku ps -a appname

以下のnumberをプロセスIDに置き換えて実行することでプロセスを停止できます。

heroku ps:stop number -a appname

まとめ

これでHerokuでDjangoアプリが動くようになりました!

コメント

タイトルとURLをコピーしました