はじめに
前章でDockerの環境が整い、Djangoのデフォルト画面が表示されました。
この章ではblogアプリを作って自分のURLを設定します。
Djangoには「URL → View → Template」という決まった流れがあります。この仕組みを理解するのがこの章の一番大事なポイントです。
Djangoの仕組みを理解する
ブラウザで http://localhost/ にアクセスしたとき、裏側でこんな流れが起きています:
ブラウザ
↓ リクエスト
Nginx(ポート80)
↓ 転送
Django(ポート8000)
↓ urls.py がURLを判定
↓ views.py が処理
↓ templates/ がHTMLを生成
↑ レスポンス
ブラウザ(ページ表示)
Djangoの中だけ取り出すと:
| ファイル | 役割 |
|---|---|
urls.py |
どのURLにアクセスされたか判定する |
views.py |
データを用意してテンプレートに渡す |
templates/ |
HTMLを生成する |
Step1. blogアプリを作る
cd ~/myblog
docker compose run --rm web python manage.py startapp blog
Djangoは機能ごとに「アプリ」を分けて管理します。今回は blog というアプリを作ります。
実行後にできるフォルダ:
~/myblog/
├ blog/
│ ├ migrations/ ← データベースの変更履歴
│ ├ __init__.py
│ ├ admin.py ← 管理画面の設定
│ ├ apps.py ← アプリの設定
│ ├ models.py ← データベースのモデル
│ ├ tests.py ← テスト
│ └ views.py ← ページの処理
├ myblog/
└ manage.py
Step2. INSTALLED_APPSにblogを登録する
アプリを作っただけではDjangoに認識されません。settings.py に登録する必要があります。
~/myblog/myblog/settings.py を開いて INSTALLED_APPS に追加:
INSTALLED_APPS = [
'blog.apps.BlogConfig', # ← 追加
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
なぜ 'blog' ではなく 'blog.apps.BlogConfig' なのか?
blog/apps.py の中に BlogConfig というクラスが自動生成されています。アプリ名だけでなくこのクラスを指定することで、アプリの設定を細かく制御できます。公式チュートリアルもこの書き方を推奨しています。
📚 参考URL:Django 公式 - Applications
INSTALLED_APPS にはここでは7個しか入れないけど、後の章で画像加工(imagekit)や SEO 用の sitemaps・sites も追加するよ〜。今はまず最小構成で動かそう!
Step3. テンプレートフォルダを作る
mkdir -p ~/myblog/blog/templates/blog
フォルダ構成:
blog/
└ templates/
└ blog/ ← アプリ名で名前空間化(重要)
└ index.html
なぜ blog/templates/blog/ と二重になっているのか?
Djangoはすべてのアプリの templates/ フォルダを横断して検索します。もし複数のアプリに index.html があると、どちらを使えばいいか区別がつきません。
blog/templates/blog/index.html とアプリ名のフォルダを挟むことで、'blog/index.html' として一意に特定できます。これが公式の推奨する書き方です。
📚 参考URL:Django チュートリアル Part 3 - 「テンプレートの名前空間」セクション
(ページ内検索で「テンプレートの名前空間」と探すと枠付きの注記ボックスが見つかります)
Step4. URLを設定する
blog/urls.pyを作る
touch ~/myblog/blog/urls.py
中身:
from django.urls import path
from . import views
app_name = 'blog' # 名前空間の設定
urlpatterns = [
path('', views.index, name='index'),
]
path('', views.index, name='index') の意味:
''→ トップページ(http://localhost/)のURLviews.index→views.pyのindex関数を呼び出すname='index'→ このURLにindexという名前をつける(テンプレートから参照するときに使う)
myblog/urls.pyにblogを追加
~/myblog/myblog/urls.py を開いて修正:
from django.contrib import admin
from django.urls import include, path
from django.http import HttpResponse
urlpatterns = [
path('health/', lambda request: HttpResponse('ok')), # ヘルスチェック用
path('', include('blog.urls')), # blogアプリのURLを追加
path('admin/', admin.site.urls),
]
ヘルスチェック用URLについて
/health/ は docker-compose.yml のhealthcheckが「Djangoが正常に動いているか」を確認するためのURLです。ok と返すだけのシンプルなエンドポイントですが、本番環境でもロードバランサーの死活監視に使えます。
ここでは myblog/urls.py には3つしか書かないけど、第7章で sitemap.xml と robots.txt、第8章で404・500ページのカスタマイズを追加するよ。今は『URL → アプリに委譲』の流れを掴めばOK!
URLの流れ
http://localhost/
↓ myblog/urls.py
↓ include('blog.urls') で blog/urls.py に委譲
↓ path('', views.index) にマッチ
↓ views.index 関数を呼び出す
次章ではこの views.index 関数を実装して、画面を表示します。
