概要
現場で使えるdjangoの教科書基礎編
この書籍はDjangoの基礎的な内容がわかりやすく記述されており学習用途としておススメできます。扱っている内容は基礎とうたっていますが、内容が簡単というよりDjangoというフレームワークを理解する上で重要な機能をまとめている印象です。
ある程度Djangoに触れたことがあれば文章を読むだけでも理解できるかもしれませんが、内容をしっかり理解するためにはサンプルアプリを動かしながら章の内容と対応するコードを確認すると効果的だと思います。本記事ではサンプルアプリの構築手順を解説していますので、手順を参考にしながら動作を確認してみてください。
サンプルアプリの概要
本書籍では著者によるサンプルアプリが公開されており、こちら(バージョン4系)から入手することができます。著者のGithubにはDjangoの過去バージョンのソースありますのでご注意ください。
akiyoko/django-book-mysite-sample, https://github.com/akiyoko/django-book-mysite-sample
上記がサンプルアプリの画面遷移図になります。ログイン画面で認証後、ショップ画面とショップ詳細にアクセスできるシンプルなアプリケーションとなっています。
また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
補足 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によるデータ作成の方法を説明しましたので、ぜひ参考にしながらサンプルアプリの動作やコードの理解を進めてみてくださいね!