cangoxina

生産性向上見習いのブログ的な何かです

DjangoアプリをHerokuにデプロイする(その2)

この記事は、DjangoアプリをHerokuにデプロイする[その2] - Qiitaアーカイブです。

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


目次


前回やったこと

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

korosuke613.hatenablog.com

今回やること

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

筆者の環境

必要なもの

今回作るアプリの構成

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を追加

# 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に以下を追加

class AddContents(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 AddContents

マイグレーションする

$ 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を以下に書き換える。

from django.contrib import admin
from .models import AddContents


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


admin.site.register(AddContents, AddContentsAdmin)

管理者を作成

$ 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 にアクセス

f:id:korosuke613:20200926192823p:plain

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

f:id:korosuke613:20200926192846p:plain

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アプリのAdd contentsモデル管理ページを表示する

サイト管理 -> BLOG -> Add contents -> 追加をクリックする。

f:id:korosuke613:20200926192920p:plain

コンテンツを追加する

AddContentsクラスで設定したとおりにフィールドが表示されるので適当に入力して"保存"をクリックする。

f:id:korosuke613:20200926192948p:plain

モデル管理画面で確認

先ほど追加したコンテンツが表示されていればOK

f:id:korosuke613:20200926193011p:plain

おまけ

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_addcontents                  | table    |                   |                   |
 public | blog_addcontents_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_addcontents;
 id |   title    |       word_text        |       date_time
----+------------+------------------------+------------------------
  1 | こんにちは   | 今日もいい天気でした。     | 2017-07-15 19:28:33+00
(1 row)

まとめ

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

参考

http://tech.pjin.jp/blog/2017/06/29/python-primer-25-django-11/



スポンサーリンク