Django REST Framework(DRF)のルーティングがどのように機能しているかを深掘りし、urls.pyの仕組みを完全理解する

はじめに

APIの設計においてルーティングはバックエンドとフロントエンドの接続点となる。

正しく理解することで、拡張や修正がしやすくなる。

urlpatternsとは

urlpatternsは、URLルーティングを定義するためのリスト。

path()やre_path()で定義されたURLパターンが含まれる。

これにより、特定のURLにアクセスしたときに、どのビューが処理するのかを指定できる。

現状のタスク管理アプリを見ていく

例えば、以下の「django_todo > myapp > urls.py」を見ていこう。(django_todo/myapp/urls.py at master · ki-hi-ro/django_todo

from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import TaskViewSet

router = DefaultRouter()
router.register(r'tasks', TaskViewSet)

urlpatterns = router.urls

urlpatternsとしてrouter.urlsが代入されている。

urlpatterns = router.urls

routerとは

routerは、DefaultRouter()でDefaultRouterクラスをインスタンス化したもの。

from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import TaskViewSet

router = DefaultRouter()
router.register(r'tasks', TaskViewSet)

urlpatterns = router.urls

DefaultRouterとは

Django REST frameworkで(DRF)でAPIのルーティングを簡単に設定するためのルータークラス。

urlpatternsに手動でpath()やre_path()を追加しなくても、自動的にViewSetに基づいたURLを生成してくれる。

GET、POST、PUT、DELETEなどのHTTPメソッドに対応。

では、先ほどのサンプルの以下の部分で何が起こっているか?

from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register(r'tasks', TaskViewSet)

この3行で以下のURLパターンが自動生成される。

URLパターン役割
GET /tasks/一覧取得(list)
POST /tasks/新規作成(create)
GET /tasks/<pk>/詳細取得(retrieve)
PUT /tasks/<pk>/更新(update)
DELETE /tasks/<pk>/削除(destroy)

順を追ってみていこう。

クラスのインポートとインスタンス化

まずは、DRFのrouterモジュールからDefaultRouterクラスをインポートしている。

from rest_framework.routers import DefaultRouter

次に、このクラスのインスタンス化を行っている。以降の処理でこのrouterに対していろいろ行うことができる。

router = DefaultRouter()

ViewSetとパスの登録

以下の部分でTaskViewSetクラスをtasksというパスで登録している。

router.register(r'tasks', TaskViewSet)

TaskViewSetクラスはこちら(django_todo/myapp/views.py at master · ki-hi-ro/django_todo

from django.shortcuts import render

# Create your views here.
from rest_framework import viewsets
from .models import Task
from .serializers import TaskSerializer

class TaskViewSet(viewsets.ModelViewSet):
  queryset = Task.objects.all()
  serializer_class = TaskSerializer

詳細については、タスク管理アプリを作っていく | ki-hi-ro.com > 【APIのエンドポイントを作成】ビューの作成を参考にしていただきたい。

実際にアクセスしてみる

まずは開発環境を起動する。

(venv) Mac:django_todo shibatahiroshitaka$ python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
March 08, 2025 - 04:59:04
Django version 4.2.19, using settings 'django_todo.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

commandを押しながら「http://127.0.0.1:8000/」にアクセス。ここでは404エラーが発生している。

これは、urls.pyにルートのURLを登録していないことが原因。

現在登録されているURLは、admin/とapi/の2点。

これらはプロジェクトのurls.pyで定義されている。(django_todo/django_todo/urls.py at master · ki-hi-ro/django_todo

"""
URL configuration for django_todo project.

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/4.2/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include('myapp.urls'))
]

ということは、admin/またはapi/にはアクセスできると考えられる。

どちらもアクセスできた。

http://127.0.0.1:8000/admin/login/?next=/admin/(リダイレクトされた)
http://127.0.0.1:8000/api/

path(‘api/’, include(‘myapp.urls’))

path(‘api/’, include(‘myapp.urls’))では、apiにアクセスしたときに、myapp/urls.pyのルーティングを適応させている。

こうすることで、以下のURLパターンが使用できる。

URLパターン役割
GET /tasks/一覧取得(list)
POST /tasks/新規作成(create)
GET /tasks/<pk>/詳細取得(retrieve)
PUT /tasks/<pk>/更新(update)
DELETE /tasks/<pk>/削除(destroy)

一覧取得

新規作成

tasksのURLで、formのメソッドにPOSTを設定することで、フォームを送信したときに新規作成することができる。

<form action="/api/tasks/" method="POST" enctype="multipart/form-data" class="form-horizontal" novalidate="">

詳細取得

tasks/<pk>で詳細ページにアクセス可能。<pk>とは主キーのこと。

更新

tasks/<pk>のURLで、formのメソッドにPUTを指定することで、フォームを送信したときに、更新処理を行える。

<form action="/api/tasks/1/" data-method="PUT" enctype="multipart/form-data" class="form-horizontal" novalidate="">

削除

DRFでは、以下のような削除ボタンが用意されていた。

<button class="btn btn-danger button-form js-tooltip" title="" data-toggle="modal" data-target="#deleteModal" data-original-title="Make a DELETE request on the Task Instance resource">DELETE</button>

削除ボタンをクリックすると、モーダルが表示された。ここに削除フォームがあった。

<form class="button-form" action="/api/tasks/1/" data-method="DELETE">

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

投稿ID : 28881