LoginSignup
9
24

More than 5 years have passed since last update.

DjangoアプリをHerokuにデプロイする[その2]

Last updated at Posted at 2017-08-01

はじめに

DjangoアプリをHeroku上で動かすときの備忘録として記録する。
その2ではDjangoアプリの管理ページを使えるようにし、モデルの作成、操作を行う。

前回 DjangoアプリをHerokuにデプロイする[その1]

前回やったこと

Djangoアプリのスタートページ(It Workのページ)をHerokuで表示するところまでやった。

今回やること

  • 管理ページを使えるようにする。
  • モデルを作成し、管理ページから操作する。

筆者の環境

macOS Sierra 10.12.5
Python 3.6.1
virtualenv 15.1.0

今回作るアプリの構成

構成
myProject
├── Procfile
├── blog
│   ├── __init__.py
│   ├── __pycache__
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── db.sqlite3
├── manage.py
├── myDjango
│   ├── __init__.py
│   ├── __pycache__
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── requirements.txt
└── runtime.txt

手順

今回はタイトル、内容、日付を追加するアプリBlogを実際に作成する。

ローカルでの作業

新しいアプリを作成

blogアプリを作成

$ python manage.py startapp blog

blogアプリを使えるようにする
myDjango/settings.pyINSTALLEF_APPSにblogを追加

myDjango/settings.py
# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog',
]

新しいモデルを作成

blogアプリで使うモデルを作成
blog/models.pyに以下を追加

blog/models.py
class Contents(models.Model):
    objects = None
    title = models.CharField(max_length=20)
    word_text = models.CharField(max_length=140)
    date_time = models.DateTimeField('投稿日')

マイグレーションファイルを作成

$ python manage.py makemigrations blog 
Migrations for 'blog':
  blog/migrations/0001_initial.py
    - Create model Contents

マイグレーションする

$ python manage.py migrate 
Operations to perform:
  Apply all migrations: admin, auth, blog, contenttypes, sessions
Running migrations:
  Applying blog.0001_initial... OK

管理ページでモデルを扱えるようにする

blog/admin.pyを以下に書き換える。

blog/admin.py
from django.contrib import admin
from .models import Contents


class ContentsAdmin(admin.ModelAdmin):
    list_display = ('id', 'title', 'word_text', 'date_time')


admin.site.register(Contents, ContentsAdmin)

管理者を作成

$ python manage.py createsuperuser
Username (leave blank to use '何も入力しないとこの部分がユーザー名になる'): <ログイン時のユーザ名>
Email address: <メールアドレス>
Password: <パスワード>
Password (again): <パスワード再入力>
Superuser created successfully.

サーバを起動

$ python manage.py runserver

確認

http://127.0.0.1:8000/admin にアクセス

管理ページログイン画面

ユーザ名、パスワードを入力して下のような画面になったらローカルでは成功。
管理ページ

Heroku上で動かす

プッシュ

$ git add .
$ git commit -m "blogアプリを作成した"
$ git push heroku master

マイグレーションする

Heroku上ではマイグレーションファイルの作成は行わない(gitで管理する)。
しかし、Herokuで扱うデータベースをpostgresとしているため、Heroku上でのマイグレーション(モデルの内容をデータベースに適用)が必要となる。

$ heroku run python manage.py migrate 

管理者の作成

ローカル上で作成した管理者はローカルのデータベース(SQLite3)に登録されているため、Heroku上で管理者を作成する必要がある。

$ heroku run python manage.py createsuperuser

確認

Heroku上のアプリを開く

$ heroku open

管理ページを表示する
開かれたページのURLに/adminを加えて開く
例) https://herokuアプリ名.herokuapp.com/admin
すると先ほど確認したようなログインページが現れるので、ログインする。

BlogアプリのContentsモデル管理ページを表示する
サイト管理 -> BLOG -> Contents -> 追加をクリックする。
Heroku上の管理ページ.png

コンテンツを追加する
Contentsクラスで設定したとおりにフィールドが表示されるので適当に入力して"保存"をクリックする。
スクリーンショット 2017-07-16 4.26.12.png

モデル管理画面で確認
先ほど追加したコンテンツが表示されていればOK
スクリーンショット 2017-07-16 4.26.58.png

おまけ

Djangoで扱うDBとHerokuで扱うDBについて

Djangoはデフォルトの設定では SQLiteを使用しており、簡単に使用できる。しかし、Herokuでは基本的にSQLiteが扱えず、postgreSQLが標準となっているため、その1でHeroku上ではpostgreSQLを扱うように設定している。

Heroku上のデータベースをのぞいてみる。

Heroku上のデータベースにアクセスするには以下のコマンドを実行する。

$ heroku pg:psql

アクセスできると、アプリ名::DATABASE=>と表示されるので\zを入力する。
注)\z : postgresにおいてテーブル一覧を表示する

dry-brook-87010::DATABASE=> \z
                                            Access privileges
 Schema |               Name                |   Type   | Access privileges | Column privileges | Policies
--------+-----------------------------------+----------+-------------------+-------------------+----------
 public | auth_group                        | table    |                   |                   |
 public | auth_group_id_seq                 | sequence |                   |                   |
 public | auth_group_permissions            | table    |                   |                   |
 public | auth_group_permissions_id_seq     | sequence |                   |                   |
 public | auth_permission                   | table    |                   |                   |
 public | auth_permission_id_seq            | sequence |                   |                   |
 public | auth_user                         | table    |                   |                   |
 public | auth_user_groups                  | table    |                   |                   |
 public | auth_user_groups_id_seq           | sequence |                   |                   |
 public | auth_user_id_seq                  | sequence |                   |                   |
 public | auth_user_user_permissions        | table    |                   |                   |
 public | auth_user_user_permissions_id_seq | sequence |                   |                   |
 public | blog_contents                  | table    |                   |                   |
 public | blog_contents_id_seq           | sequence |                   |                   |
 public | django_admin_log                  | table    |                   |                   |
 public | django_admin_log_id_seq           | sequence |                   |                   |
 public | django_content_type               | table    |                   |                   |
 public | django_content_type_id_seq        | sequence |                   |                   |
 public | django_migrations                 | table    |                   |                   |
 public | django_migrations_id_seq          | sequence |                   |                   |
 public | django_session                    | table    |                   |                   |
(21 rows)

実際にSQL文を入力するとデータベースを操作できる。

dry-brook-87010::DATABASE=> select * from blog_contents;
 id |   title    |       word_text        |       date_time
----+------------+------------------------+------------------------
  1 | こんにちは   | 今日もいい天気でした。     | 2017-07-15 19:28:33+00
(1 row)

まとめ

今回は管理ページを使えるようにし、新しいアプリとそのモデルを作成し、Heroku上でデータベースを管理するところまでをやった。
次回はテンプレートを作成し、今回作ったブログを外部に公開できるところまでをする。(予定)

参考

Python入門 Djangoの使い方(その11)モデルを使う。

9
24
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
9
24