Django: ルーティングのテストとデバッグ

Django 4 の実践(アプリ開発編)

日付:2025年2月19日

Django の `urls.py` におけるルーティングのデバッグ方法と、正しく動作しない場合のトラブルシューティングについて解説します。

目 次

はじめに

Django では urls.py にルーティングを定義し、リクエストが適切なビューにマッピングされるように設定します。
しかし、URL の競合や設定ミスにより 「ページが見つかりません (404)」「不正なリクエスト (400)」 といったエラーが発生することがあります。

本記事では、 Django のルーティングのテストとデバッグ方法 を詳しく解説します。

1. ルーティングの動作確認

Django では、URL のルーティングを確認するために以下の方法を活用できます。

基本的な確認方法

  1. 開発サーバーを起動し、ブラウザで確認
    BASH
    python manage.py runserver
    • http://127.0.0.1:8000/ にアクセスして、ページが表示されるか確認
  2. show_urls コマンドを使う (Django Extensions)
    BASH
    python manage.py show_urls
    • すべてのルーティングを一覧表示 し、登録ミスがないか確認できる
    • django-extensions をインストールする必要あり (pip install django-extensions)

2. reverse() を使った URL の逆引き確認

Django の reverse() を使うことで、 URL の逆引き (name 属性を基に URL を取得) が可能 です。

(1) reverse() の基本

urls.py に以下のようなルートがあるとします。

PYTHON
from django.urls import path from .views import home_view, detail_view urlpatterns = [ path('home/', home_view, name='home'), path('home/<int:id>/', detail_view, name='home_detail'), ]

Python コード内で reverse() を使って URL を取得できます。

PYTHON
from django.urls import reverse print(reverse('home')) # → '/home/' print(reverse('home_detail', args=[123])) # → '/home/123/'

ポイント:

  • reverse('home')/home/ を返す
  • reverse('home_detail', args=[123])/home/123/ を返す
  • URL の name= を基に動的に URL を生成できる

テンプレート内での利用

HTML
<a href="{% url 'home' %}">ホームへ戻る</a>

エラーの原因

  • reverse() に指定した nameurls.py に存在しないと エラー発生
  • args の数や型が urlpatterns と一致しない場合 エラー発生

3. resolve() を使った URL の解析

resolve() を使うと、 URL にマッチするビュー関数を取得 できます。

(1) resolve() の基本

PYTHON
from django.urls import resolve match = resolve('/home/123/') print(match.view_name) # → 'home_detail' print(match.kwargs) # → {'id': 123}

用途:

  • ルーティングのデバッグ
  • どのビュー関数が呼ばれるか確認

エラーの原因:

  • 定義されていない URL を resolve() すると Resolver404 エラーが発生

4. urlpatterns の順番ミスによるトラブル

Django のルーティングは 上から順に評価される ため、 特定のパターンが先にマッチしてしまうと、意図したルートが機能しない ことがあります。

(1) 競合するルーティングの例

PYTHON
urlpatterns = [ path('home/<str:id>/', detail_view, name='home_detail'), path('home/', home_view, name='home'), ]

この場合の問題点:

  • /home/ にアクセスすると、<str:id> がキャッチしてしまい、意図した home_view が実行されない

解決策: 固定パス (/home/) を 先に記述

PYTHON
urlpatterns = [ path('home/', home_view, name='home'), path('home/<str:id>/', detail_view, name='home_detail'), ]

5. DEBUG = False の場合の 404 エラー確認

本番環境 (DEBUG = False) では、 標準の 404 エラーページ が表示され、詳細なエラーメッセージは見られません。

エラーの原因を調査するには、 ロギングを有効化 すると便利です。

(1) settings.py にロギングを設定

PYTHON
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'file': { 'level': 'ERROR', 'class': 'logging.FileHandler', 'filename': 'django_errors.log', }, }, 'loggers': { 'django': { 'handlers': ['file'], 'level': 'ERROR', 'propagate': True, }, }, }

ポイント:

  • django_errors.log にエラーログを記録
  • DEBUG = False の場合でも どの URL でエラーが発生したか確認可能

6. まとめ

  • reverse() を使うと URL の逆引きができる
  • resolve() を使うと URL からビュー関数を取得できる
  • ルーティングの 順番が間違っていると、意図しない URL にマッチする ことがある
  • DEBUG = False では エラーログを活用 して問題を特定する