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
ビュー関数を呼び出し、年と月をyear
とmonth
キーワード引数として渡す
例 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 パターンとビュー関数を関連付けるための最も一般的な方法です。