Hirologue

年齢を理由にエンジニアになることを諦めないミドルの成長記録

EP 21: あ、Djangoチュートリアル その前に

はじめに

PythonSQL、RESTと学びましたので、いよいよWebフレームワークのDjangoの学習を開始します。

Djangoの学習は、HappinessChainの学習ロードマップにおける大きな山場の一つと個人的には捉えています。

ここは、「Djangoの概要(全体像)を知る」、「Djangoのしくみを理解する(わかる)」、「Djangoを使ってWebアプリを開発できる」をこれまで以上に強く意識して学習に取り組みます。

まずはDjangoの概要(全体像)を知るために、Udemyの講座で学習を行いました。
講座の内容にしたがって講師と同じ環境を構築するので、環境構築でつまづくこともなくスムーズに進みます。
動画を視聴しながら実際に手を動かして学習を進め、Djangoの概要(全体像)を知ることができました。

何度かエラーも出ましたが、原因はほぼ100%でタイポでした。

と、順調にDjangoの概要(全体像)を知ることができましたので、次はDjangoのしくみを理解するための学習をはじめます。
しくみを理解するには、その大本である公式ドキュメントを読む必要があります。
しかしながら、用意されているDjangoのドキュメントは膨大な量で、そのすべてを読み込むことはナンセンスです。

そんなときは、公式チュートリアルの出番です。
この公式チュートリアルには、Djangoにおいて必要とされるエッセンスがギュッと凝縮されています。
ならば、この公式チュートリアルをつかってDjangoのしくみをしっかり理解するのがベストプラクティスです。

では、公式ドキュメントにしたがって環境構築をしてスタート!

といきたいところですが、ちょっと待った!

私はWebエンジニアになりたい。
ということは、チームで開発することを意識しなければならない。
つまり、みんな同じ開発環境である必要がある。
そんなときどうするか?
そう、Dockerの出番ですね。

前置きが長くなりましたが、本記事ではDjango公式チュートリアルで学習するための開発環境を構築します。

開発環境をどうするか

Djangoを使うにはPythonが必要なわけですが、今回使用するバージョンは3.12.5とします。
Djangoのバージョンは2024年9月時点の最新版ではなく、LTS(Long Term Support)版の4.2.16とし、データベースはPostgreSQLのlatestバージョンを使用することにしました。

Djangoをインストールするには、requirements.txtに記述する必要があります。
requirements.txtにパッケージを記述すると一括でインストールできるので、他にも必要なパッケージがあれば追記します。
ここで必要な追加パッケージは、django-environとpsycopgです。
詳細な説明は省略しますが、django-environは、Django環境変数を扱う際に便利なパッケージで、psyocopgはデータベースとして使用するPostgreSQLのためのパッケージです。

Dockerファイルを作る

では、以前の記事を参考にDockerファイルを作成します。

FROM python:3.12.5-slim
ENV PYTHONUNBUFFERED=1

WORKDIR /django_tutorial
COPY requirements.txt /django_tutorial
RUN pip install --upgrade pip && \
    pip install -r requirements.txt

COPY . /django_tutorial/


続いて、パッケージをインストールするためのrequirements.txtを作成します。

Django==4.2.16
django-environ==0.11.2
psycopg[binary]==3.2.1

これでdockerfileとrequirements.txtの準備は完了です。

docker-compose.ymlファイルを作る

続いて、以前の記事を参考に docker-compose.ymlファイルを作成します。

# version: '3'  # 私の環境では不要なのでコメントアウトしています

services:
  web:
    build: .
    ports:
      - '8000:8000'
    volumes:
      - '.:/django_tutorial'
    depends_on:
      - db
    tty: true
    stdin_open: true

  db:
    image: postgres
    platform: linux/amd64
    volumes:
      - db-data:/var/lib/postgresql/data
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_DB=django_develop
      - POSTGRES_PASSWORD=postgres

volumes:
  db-data:

細かい部分の説明は割愛しますが、とりあえずこの状態でコンテナを立ち上げます。

$ docker compose up -d



環境変数を設定する

さて、無事にコンテナが立ち上がりましたが、Djangoを起動させたい気分をグッとこらえましょう。

次にやるのは、環境変数の設定です。
requirements.txtに記述したパッケージ「django-environ」の出番です。

django-environを使うには、manage.pyと同じ階層に.envファイルを作る必要があるので作成します。

なお、gitでバージョン管理を行っている場合は、この.envファイルを管理対象から外すことを忘れないでください。

作成した.envファイルに必要な環境変数を書き込んでいきましょう。
データベース周りの環境変数を記述します。

DATABASE_URL="postgres://postgres:postgres@db:5432/django_develop"

ちなみに、この環境変数は次のような作りとなっています。

DATABASE_URL=[データベースエンジン]://[ユーザー名]:[パスワード]@[ホスト名]:[ポート番号]/[データベース名]

(参考: https://freemas.stepupkaraoke.com/python/django/about-django-environ

環境変数の設定は一旦ここまでとして、次に進みます。

プロジェクトの作成

ターミナルで作業ディレクトリにいることを確認して、次のコマンドを入力します。

$ django admin-startproject config .

コマンドの最後のピリオドを忘れずに入れて実行するとconfigと言う名のディレクトリが作成されます。

settigns.pyに追加の設定を記述 その1

次にconfig/settings.pyファイルを開いて、いくつか追加の設定を行います。
まずは、django-environをインポートして使うための設定です。

from pathlib import Path

import environ  # この行を追記

BASE_DIR = Path(__file__).resolve().parent.parent

env = environ.Env()  # この行を追記
environ.Env.read_env(env_file=str(BASE_DIR) + '/.env')  # この行を追記

これで、先程作成した.envファイルを読み込めるようになりました。
しかし、少し下の行に目をやると・・・

SECRET_KEY = 'django<ランダムな文字列>' 

といった具合に、本来秘密であるはずのSECRET_KEYがハードコーディングされています。
これはあまりよろしくないことなので、何とかしなければなりません。

SECRET_KEYの再生成

DjangoにはSECRET_KEYを生成するためのしくみが用意されています。
早速、キーを再生成しましょう。
そのために適当な名前の.pyファイル(ここではregenerate.pyとします)を作成します。
そして、次のコード書いて実行します。

from django.core.management.utils import get_random_secret_key

secret_key = get_random_secret_key()
text = f'SECRET_KEY={secret_key}'
print(text)

コードを実行すると、文字列が出力されますので.envファイルに出力結果をコピペします。
こうして.envファイルは次のようになります。

DATABASE_URL="postgres://postgres:postgres@db:5432/django_develop"
SECRET_KEY='<再生成されたランダムな文字列>'

(参考: https://noauto-nolife.com/post/django-secret-key-regenerate/

settigns.pyに追加の設定を記述 その2

これで必要な環境変数が用意できたので、.envファイルの内容をsettings.pyファイルに反映させます。
ついでにALLOWED_HOSTSの設定も追記します。

(略)
SECRET_KEY = env('SECRET_KEY') 
(略)
ALLOWED_HOSTS = ['0.0.0.0']  # 追記
(略)
DATABASES = {
    'default': env.db(),  # 辞書の値を変更
}



hello django!

これで準備万端整いましたので、まずはコンテナを立ち上げて、bashを起動させます。

$ docker compose up -d

$ docker compose exec web bash

では、待望のロケットを飛ばしましょう!
次のコマンドを入力します。

$ python manage.py runserver 0.0.0.0:8000

見事に飛びました!あー長かった。

これで、ようやく公式チュートリアルで学習を開始する準備が整いました。


いかがだったでしょうか?
この記事がDockerでDjangoの環境構築をしようとしている方のお役に立てたら幸いです。

次回は、公式チュートリアルからDjangoを理解する過程で感じたことや気づきを初心者目線でリアルに伝えたいと思います!

ぜひお楽しみに!では、また✋️