【Docker】で構築したDjangoのホームぺージでトップページを作成する方法

「Docker-compose」で構築したDjangoではデフォルトで以下のようなトップページとなっています。

このトップページを自分で作成したページで表示する手順をまとめました。

DockerコンテナでDjangoを構築する手順は以下のページを参考にしてください。
今回の環境は、CentOS8で実施しています。

【docker-compose】Django+PostgreSQL+Nginxを連携した構築手順(CentOS8+VPS環境)

「Docker-compose」で構築したDjangoのトップページを自作のページに変更する方法

今回はDjangoのトップページにおいて簡単なページを作成して表示させる手順までをまとめます。

Djangoコンテナの構築は上記のページを参考にしてください。
今回のDjangoプロジェクトのフォルダは以下のように配置しました。

django/
|-- Dockerfile
|-- db-data
|-- docker-compose.yml
|-- manage.py
|-- myhp
|-- mysite
|-- requirements.txt
|-- ssl_certs
|-- static
`-- templates
    |-- base.html
    `-- index.html

フォルダやファイルの配置は上記のようにし、「docker-compose」の設計内容は以下となりました。

※「docker-compose.yml」

version: '3'

services:
  db:
    image: postgres
    ports:
            - 5432:5432
    environment:
            - POSTGRES_PASSWORD=postgres
    volumes:
            - ./db-data:/var/lib/postgresql/data
    container_name: postgres

  web:
    restart: always
    build: .
    command: bash -c "python manage.py runserver 0.0.0.0:8000 && python manage.py migrate"
    volumes:
            - .:/code
    ports:
            - 8000:8000
    depends_on:
            - db
    container_name: django

  https-portal:
    image: steveltn/https-portal:1
    ports:
            - 80:80
            - 443:443
    links:
            - web
    restart: always
    environment:
      DOMAINS: 'test.engineers-life.com -> http://web:8000'
      STAGE: 'production' # Don't use production until staging works
      #FORCE_RENEW: 'true'
    container_name: https-portal
    volumes:
            - ./ssl_certs:/var/lib/https-portal
volumes:
    db-data:
    ssl_certs:

上記、docker-composeの設計で「docker-compose up」を実施します。

ホームページを作成するための「アプリ」を作成

DockerでDjangoコンテナを起動したあとは、自作するホームページようのアプリを作成します。
以下では、わかりやすいように「myhp」という名前で実施します。

今回はDockerコンテナ上のDjangoに対してアプリを作成するので、以下のように、コンテナのサービス名「web」を指名して実行します。

$ docker-compose run web python manage.py startapp myhp

上記実行後、以下のように「myhp」のフォルダが作成されます。

$ ll
total 48
-rw-r--r--  1 root             root  147 Apr 28 16:17 Dockerfile
-rw-r--r--  1 root             root  174 Apr 22 19:53 Dockerfile_bk
drwx------ 19 systemd-coredump root 4096 May 22 15:14 db-data
-rw-r--r--  1 root             root  955 May 18 16:43 docker-compose.yml
-rw-r--r--  1 root             root  663 May  6 14:12 docker-compose.yml_bk
-rwxr-xr-x  1 root             root  626 May  8 15:54 manage.py
drwxr-xr-x  3 root             root 4096 May 22 15:51 myhp
drwxr-xr-x  3 root             root 4096 May 22 15:15 mysite
-rw-r--r--  1 root             root   42 May  7 18:39 requirements.txt
-rw-r--r--  1 root             root   52 Apr 12 15:34 requirements.txt_bk
drwxr-xr-x  3 root             root 4096 May  9 12:57 ssl_certs
drwxr-xr-x  4 root             root 4096 May 21 18:29 static

アプリが正常に作成されると、該当フォルダ内に以下のようなファイルが作成されます。

$ ll myhp/
total 24
-rw-r--r-- 1 root root    0 May 22 15:51 __init__.py
-rw-r--r-- 1 root root   63 May 22 15:51 admin.py
-rw-r--r-- 1 root root   83 May 22 15:51 apps.py
drwxr-xr-x 2 root root 4096 May 22 15:51 migrations
-rw-r--r-- 1 root root   57 May 22 15:51 models.py
-rw-r--r-- 1 root root   60 May 22 15:51 tests.py
-rw-r--r-- 1 root root   63 May 22 15:51 views.py
$

親プロジェクトに作成したアプリ名を追加

次に、親プロフェクトに上記で作成したアプリ「myhp」を追加します。
以下で親プロジェクトの「settings.py」を編集します。

$ vim mysite/settings.py

settings.pyで以下の該当箇所を編集します。

# Application definition

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

------中略------

LANGUAGE_CODE = 'ja'
#LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'Asia/Tokyo'
#TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True

管理ユーザーを作成する

次にDjangoの管理ユーザーを作成します。
DjangoはDockerコンテナで構築しているので以下のコマンドで実行します。

※エラーが発生した場合、次の項目の「migrate」を先に実行します。

$ docker-compose run web python manage.py createsuperuser
Username (leave blank to use 'root'): admin
Email address: test@gmail.com
Password:
Password (again):
Superuser created successfully.
$

上記設定が成功したら以下の該当アドレスにアクセスします。

https://IPアドレス/admin

今回の設定は、SSLで構築した環境となっているので上記となりますが、デフォルトは以下のURLで管理画面にアクセスできます。

http://IPアドレス:8000/admin

設定を同期するために「migrate」を実行

上記の設定をしたあとは、「migrate」を実行し同期させます。

$ docker-compose run web python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying sessions.0001_initial... OK
$

ルーティングを設定する

Djangoプロジェクト全体のルーティング設定ファイルを設定します。

プロジェクト「misite」配下の「urls.py」を編集します。

$ vim mysite/urls.py

------中略------

from django.contrib import admin
from django.urls import path, include #追加

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('myhp.urls')), #追加
]

6行目でinclude関数をインポートします。
10行目でプロジェクト「mysite」がアプリ「myhp」をincludeするように設定します。

path関数の第一引数が「”」となっているのは、以下にマッチングします。

http(s)://<ホスト名>/〜
http(s)://<IPアドレス>/〜

第2引数の「include」は、include関数を使って「myhp/url.py」に処理を渡す命令を書いています。

ホームページ用のHTMLを作成

プロジェクトとアプリを作成している同じ階層で以下「template」フォルダを作成します。

$ mkdir templates

同じ階層で「template」フォルダが作成されたことを確認します。

$ ll
total 52
-rw-r--r--  1 root             root  147 Apr 28 16:17 Dockerfile
drwx------ 19 systemd-coredump root 4096 May 22 15:14 db-data
-rw-r--r--  1 root             root  955 May 18 16:43 docker-compose.yml
-rwxr-xr-x  1 root             root  626 May  8 15:54 manage.py
drwxr-xr-x  4 root             root 4096 May 22 16:30 myhp
drwxr-xr-x  3 root             root 4096 May 22 16:40 mysite
-rw-r--r--  1 root             root   42 May  7 18:39 requirements.txt
drwxr-xr-x  3 root             root 4096 May  9 12:57 ssl_certs
drwxr-xr-x  4 root             root 4096 May 21 18:29 static
drwxr-xr-x  2 root             root 4096 May 22 16:41 templates

次にtemplateフォルダ配下へ移動します。

$ cd templates/

「template」フォルダないに以下HTMLファイルを作成します。

base.html作成

$ vim base.html
<html>
    <head>
        <title>ホームページ</title>
    </head>
    <body>
        <p>ここがbase.htmlです。</p>

    {% block main_containts %}
    {% endblock %}

        <p>ここがbase.htmlです。</p>
    </body>

</html>

index.html

$ vim index.html
{% extends "base.html" %}
{% block main_containts %}
{% load static %}

  <main>
    ここがindex.htmlです。
  </main>

{% endblock %}

Viewを作成する

アプリケーション用ディレクトリ「myhp」に自動作成されている「view.py」に処理を記述します。

$ cd myhp
$ ll
total 28
-rw-r--r-- 1 root root    0 May 22 15:51 __init__.py
drwxr-xr-x 2 root root 4096 May 22 16:30 __pycache__
-rw-r--r-- 1 root root   63 May 22 15:51 admin.py
-rw-r--r-- 1 root root   83 May 22 15:51 apps.py
drwxr-xr-x 3 root root 4096 May 22 16:30 migrations
-rw-r--r-- 1 root root   57 May 22 15:51 models.py
-rw-r--r-- 1 root root   60 May 22 15:51 tests.py
-rw-r--r-- 1 root root   63 May 22 15:51 views.py
$

「view.py」を編集します。

$ vim views.py

今回は5行目〜11行目を追記します。

from django.shortcuts import render

# Create your views here.

from django.http import HttpResponse
from django.template import Context, loader

def index(request):
    template = loader.get_template('index.html')
    context = {}
    return HttpResponse(template.render(context, request))

「myhp」配下でurls.pyを新規作成

上記で、プロジェクト「mysite」配下のurls.pyを作成しましたが、アプリ「myhp」配下にも新規で「urls.py」を作成します。

「urls.py」新規作成します。

$ vim urls.py

「urls.py」で以下のように設定をします。

from django.urls import path
from . import views

app_name = 'myhp'
urlpatterns = [
    path('', views.index, name='index'),
]

プロジェクト「mysite」で「templates」を読み込むようにする

vim mysite/setting.py
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': ['templates'], #追加
        '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',
            ],
        },
    },
]

上記設定を追加することで、ドメインのトップページへアクセスすると下記のような画面になります。

CSS, JavaScript, Imagesはスタティックフォルダに保存する

ちなみに「setting.py」で以下の記述が書かれています。

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.0/howto/static-files/

STATIC_URL = '/static/'

上記のとおりCSSやJavaScript、Imagesファイルはスタティックフォルダを作成し、その配下に保存するようにしましょう。

Bootstrapで取得した「CSS」や「js」はこの配下に保存しています。

DockerコンテナでDjangoの簡単なホームページの作成は以上となります。




エンジニアのオンライン学習

ITエンジニアにおすすめの教材、オンラインスクールです。
無料からエンジニアの学習ができる教材などまとめているので参考にしてください。

おすすめオンライン教材
自宅で学習ができるオンラインスクール

ITエンジニアの開発・検証・学習としてインターネット上で専用のサーバ(VPS)を利用しましょう!
実務経験はVPSで学べます。



コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

ABOUT US
げんき☆ひろき
インターネット関連のSEをやっています。 ネットワーク、サーバー、ストレージ、仮想基盤まで幅広く手を出しており、MVNOの構築経験もあります。 現在は、Pythonを使ったプログラミングの開発をしネットワークの自動化ツールを作成しています! Pythonの入門書も作成しているので、ぜひ参考にしてください!