「現場で使えるdjangoの教科書基礎編」のサンプルアプリチュートリアル

eyecatch-django-book-basic-sampleapp-tutorial
目次

概要

現場で使えるdjangoの教科書基礎編

この書籍はDjangoの基礎的な内容がわかりやすく記述されており学習用途としておススメできます。扱っている内容は基礎とうたっていますが、内容が簡単というよりDjangoというフレームワークを理解する上で重要な機能をまとめている印象です。

ある程度Djangoに触れたことがあれば文章を読むだけでも理解できるかもしれませんが、内容をしっかり理解するためにはサンプルアプリを動かしながら章の内容と対応するコードを確認すると効果的だと思います。本記事ではサンプルアプリの構築手順を解説していますので、手順を参考にしながら動作を確認してみてください。

サンプルアプリの概要

本書籍では著者によるサンプルアプリが公開されており、こちら(バージョン4系)から入手することができます。著者のGithubにはDjangoの過去バージョンのソースありますのでご注意ください。

akiyoko/django-book-mysite-sample, https://github.com/akiyoko/django-book-mysite-sample

上記がサンプルアプリの画面遷移図になります。ログイン画面で認証後、ショップ画面とショップ詳細にアクセスできるシンプルなアプリケーションとなっています。

またadmin画面も利用ができ、各種データの追加が可能となっています。

django-sampleapp-admin

サンプルアプリの動作手順

前提

EC2(t2.mincro、ubuntu)
windows11からvs codeにてSSH接続
Dockerの基礎知識

環境構築

まずGithubから対象のソースをクローンします。lsコマンドを実行するとdjango4-mysite-sampleディレクトリができていることが確認できます。

# ソースコードをクローンしたい場所に移動(ここではホームディレクトリに移動)
cd ~

# ソースコードをクローン
git clone https://github.com/akiyoko/django4-mysite-sample
ls
django4-mysite-sample

クローンが完了後、django4-mysite-sample直下のDockerfileを開きます。そして48行目にDEBIAN_FRONTEND...から始まるコマンドを追記してください。これはタイムゾーンを管理するtzdataをインストールするコマンドになります。

またこのDockerfileにはapt install -yの記述が7行目と41行目にありますが、必ず41行目のapt install -yに続けてDEBIAN_FORNTEND...を記述するようにしてください。7行目のapt install -yに追記するとなぜがインストールができませんでした。

# Install other packages
RUN apt update \
    && apt install -y \
        vim \
        # SQLite (option)
        sqlite3 \
        # MySQL (option)
        # https://stackoverflow.com/a/25682993
        # libmysqlclient-dev \
    && DEBIAN_FRONTEND=noninteractive apt install -y tzdata && ln -fs /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && dpkg-reconfigure -f noninteractive tzdata \
    && apt clean \
    && rm -rf /var/lib/apt/lists/*

Dockerfileの修正が終わりましたらdocker buildとdocker runにてコンテナを起動させます。出力の最後に8-12行目のような表示が確認できれば成功です。11行目のhttp://0.0.0.0:8000/をブラウザでアクセスすると下図のような画面が表示されます。最後にコードにあるログイン情報を入力すればOKです。

# イメージビルド
docker build -t mysite-sample:1.0 .

# フォアグラウンド実行
docker run -it -p 8000:8000 -v ~/django4-mysite-sample:/root/mysite --name mysite mysite-sample:1.0 /bin/bash

...
System check identified no issues (0 silenced).
October 20, 2024 - 10:22:35
Django version 4.2.4, using settings 'config.settings.local'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.

# ログイン情報は下記
admin
pass12345
django-sampleapp-login

補足 localhost:8000/adminが表示されない場合

上記の手順でDockerfileの編集をし忘れてdocker buildとdocker runを実行すると下記のエラーが表示される場合があります。これは27行目にあるtzdataがOSにインストールされていないために生じるエラーのようです。

対応策としては上記の手順でDockerfileにtzdataのインストール手順を加えていますのでそちらを記述しdokcer buildとdocker runを実行してみてください。

# 画面の表示
A server error occurred.  Please contact the administrator.

# ターミナル出力
Traceback (most recent call last):
  File "/usr/local/lib/python3.9/zoneinfo/_common.py", line 12, in load_tzdata
    return importlib.resources.open_binary(package_name, resource_name)
  File "/usr/local/lib/python3.9/importlib/resources.py", line 88, in open_binary
    package = _get_package(package)
  File "/usr/local/lib/python3.9/importlib/resources.py", line 49, in _get_package
    module = _resolve(package)
  File "/usr/local/lib/python3.9/importlib/resources.py", line 40, in _resolve
    return import_module(name)
  File "/usr/local/lib/python3.9/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
  File "<frozen importlib._bootstrap>", line 972, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
  File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
  File "<frozen importlib._bootstrap>", line 972, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
  File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
  File "<frozen importlib._bootstrap>", line 984, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'tzdata'

補足 初めからshopにデータを入れたいとき

本操作は画面からログインした時点で書籍データを見たいという方向けです。

まずdocker runをする前にshopデータを作成します。下のディレクトリ構成を参考にディレクトリの直下にfixturesディレクトリを作成し、さらにその直下にshop.jsonを作成します。

...
├── shop
   ├── ...
   ├── fixtures
      └── shop.json

shop.jsonには下記の内容を記述します。

[
{
    "model": "shop.publisher",
    "pk": 1,
    "fields": {
        "name": "サンプル出版社"
    }
},
{
    "model": "shop.author",
    "pk": 1,
    "fields": {
        "name": "著者A"
    }
},
{
    "model": "shop.author",
    "pk": 2,
    "fields": {
        "name": "著者B"
    }
},
{
    "model": "shop.book",
    "pk": 1,
    "fields": {
        "title": "サンプル本",
        "image": "",
        "publisher": 1,
        "price": 1500,
        "description": "サンプルの説明",
        "publish_date": null,
        "authors": [
            1,
            2
        ]
    }
}
]

shop.jsonを作成後、2行目のdocker runコマンドでコンテナを起動します。すると4行目にあるようにshop.jsonがデータとして読み込まれます。

# フォアグラウンド実行
docker run -it -p 8000:8000 -v ~/django4-mysite-sample:/root/mysite --name mysite mysite-sample:1.0 /bin/bash

Installed 4 object(s) from 1 fixture(s)
[django.utils.autoreload] 2024-10-20 10:37:40,808 [INFO] /usr/local/lib/python3.9/site-packages/django/utils/autoreload.py:668 Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
October 20, 2024 - 10:37:41
Django version 4.2.4, using settings 'config.settings.local'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.

ログインしてみると下記のように1つの書籍データが登録されていることがわかります。

まとめ

本記事では現場で使えるdjangoの教科書基礎編のサンプルアプリの実行方法を解説しました。書籍やGithubには記載のなかったtzdataの対処方法やjsonによるデータ作成の方法を説明しましたので、ぜひ参考にしながらサンプルアプリの動作やコードの理解を進めてみてくださいね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

Hack Luck Labの管理人hakula(ハクラ)です。2012年にSIerに新卒入社し、SE、新規事業、情シスを担当。その後、ITコンサルを経て、現在はバックエンドエンジニア。過去にはC#、SQL Server、JavaScriptで開発を行い、現在はPython、Rest Framework、Postgresql、Linux、AWSなどを使用しています。ノーコードツールやDX関連も興味あり。「技術は価値を生むために使う」ことが信条で、顧客や組織への貢献を重視しています。

目次