Django API における URL パターンとビュー関数を徹底解説!


  • set_urlconf(): プロジェクト全体の URLconf を設定します。これは通常、settings.py モジュールで行われます。
    • 例: set_urlconf('myproject.urls') は、myproject プロジェクトの urls.py モジュールを URLconf として設定します。
  • include(): 別の URLconf から URL パターンをインクルードします。アプリケーションをモジュール化し、URL 構造を整理するのに役立ちます。
    • 例: include('blog.urls') は、blog アプリケーションの urls.py モジュールにある URL パターンをインクルードします。
  • re_path(): 正規表現を使用した URL パターンに一致するリクエストを処理するビュー関数を定義します。より複雑な URL パターンを定義する場合に役立ちます。
    • 例: re_path(r'^comments/(?P<pk>\d+)/$', views.comment_detail) は、/comments/123/ のような URL に一致し、views.comment_detail ビュー関数を呼び出し、pk キーワード引数にコメント ID を渡します。
  • path(): 特定の URL パターンに一致するリクエストを処理するビュー関数を定義します。最も一般的に使用される関数です。
    • 例: path('articles/<int:year>/<int:month>/', views.article_list) は、/articles/2020/12/ のような URL に一致し、views.article_list ビュー関数を呼び出します。
  • resolve(): URL パターンと引数を使用して、ビュー関数とキーワード引数を解決します。
    • 例: resolve('article_detail', args=(2020, 12, 1)) は、views.article_detail ビュー関数と pk=1 キーワード引数を返します。
  • reverse(): URL パターンと引数を使用して、URL を生成します。
    • 例: reverse('article_detail', args=(2020, 12, 1)) は、/articles/2020/12/1/ のような URL を生成します。


例 1: 基本的な URL パターン

from django.urls import path, include

urlpatterns = [
    path('articles/', views.article_list),
    path('comments/<int:pk>/', views.comment_detail),
    include('blog.urls'),
]

この例では、以下の URL パターンを定義しています。

  • /blog/: blog アプリケーションの urls.py モジュールにある URL パターンをインクルード
  • /comments/<int:pk>/: views.comment_detail ビュー関数を呼び出し、コメント ID を pk キーワード引数として渡す
  • /articles/: views.article_list ビュー関数を呼び出す

例 2: 正規表現を使用した URL パターン

from django.urls import re_path

urlpatterns = [
    re_path(r'^news/(?P<year>\d{4})/(?P<month>\d{1,2})/$', views.news_archive),
]
  • /news/<year>/<month>/: views.news_archive ビュー関数を呼び出し、年と月を yearmonth キーワード引数として渡す

例 3: URL の生成

from django.urls import reverse

article_url = reverse('article_detail', args=(2020, 12, 1))
print(article_url)  # 出力: /articles/2020/12/1/

この例では、/articles/2020/12/1/ のような URL を生成しています。

from django.urls import resolve

resolved_object = resolve('comment_detail', args=(123,))
print(resolved_object.func)  # 出力: views.comment_detail
print(resolved_object.kwargs)  # 出力: {'pk': 123}

この例では、views.comment_detail ビュー関数と pk=123 キーワード引数を解決しています。



関数ベースのビュー

Django 1.11 以降、関数ベースのビューを使用することができます。これは、ビュー関数をデコレータで直接装飾することで URL パターンを定義する簡潔な方法です。

from django.views.decorators.http import require_http_methods

@require_http_methods(['GET'])
def article_list(request):
    # ...
    return render(request, 'articles/list.html', context)

urlpatterns = [
    path('articles/', article_list),
]

クラスベースのビュー

クラスベースのビューを使用することもできます。これは、URL パターンとビューロジックをより明確に分離できる方法です。

from django.views.generic import ListView

class ArticleListView(ListView):
    model = Article
    template_name = 'articles/list.html'

urlpatterns = [
    path('articles/', ArticleListView.as_view()),
]

REST framework

REST API を構築する場合、REST framework は優れた選択肢です。これは、シリアライザー、ビューセット、ルーターなど、URL パターンとビュー関数を定義するための専用のツールを提供します。

from rest_framework import viewsets, serializers

class ArticleSerializer(serializers.ModelSerializer):
    class Meta:
        model = Article
        fields = '__all__'

class ArticleViewSet(viewsets.ModelViewSet):
    queryset = Article.objects.all()
    serializer_class = ArticleSerializer

router = routers.DefaultRouter()
router.register('articles', ArticleViewSet)

urlpatterns = [
    path('api/', include(router.urls)),
]

他にも、URL パターンとビュー関数を定義するためのサードパーティライブラリがいくつか存在します。

これらの代替方法はそれぞれ長所と短所があり、プロジェクトの要件に応じて最適な方法を選択する必要があります。

  • プロジェクトの要件に応じて、最適な方法を選択する必要があります。
  • 関数ベースのビュー、クラスベースのビュー、REST framework、サードパーティライブラリなど、いくつかの代替方法も存在します。
  • django.urls ユーティリティ関数は、Django API における URL パターンとビュー関数を関連付けるための最も一般的な方法です。