PR

【Django】urls.py の仕組み・使い方のコツを3分で解説

Django

Djangoの中心的な要素であるurls.pyは、ユーザがアクセスしたURLを適切なビュー関数に接続する役割を担います。

Django urls.py
図1:URLパターン

参考 Django:ビュー関数(views.py)とは?

この記事では、urls.pyの設定方法と、DjangoのURLルーティングがどのように動作するかを詳しく解説。Djangoアプリケーションを利用し、適切なURL設計を行うための知識を深めていきましょう。

このページで学べる内容
  • Django URLパターン: 基本概念
    • urls.pyとは何か?
    • URLパターンの基本的な書き方
  • 動的URLパターン
  • 名前付きURLパターン
  • URL名前空間
  • 最適なURL設計とベストプラクティス

Pythonエンジニア/Djangoを利用したWeb開発者を目指す方であれば知らないと恥ずかしい超・基本知識の1つ。是非最後までご覧ください。

参考 Pythonの基本的な書き方・構文ルール

スポンサーリンク

Django:URLパターンの基本

DjangoにおけるURLパターンの設定は、Webアプリケーションがユーザーのリクエストにどのように応答するかを定義する重要な設定です。このセクションでは、urls.pyファイルの役割と、基本的なURLパターンの作り方を解説します。

URLパターンとは?

URLパターンとは、Djangoがどのビュー関数を呼び出すかを判断するために使用するURLのルールまたはテンプレートのことを指します。

URLパターンは、Djangoのurls.pyファイル内で定義され、アプリケーションがブラウザからのリクエストをどのビューにルーティングするかを定義します。

例えば、あなたがブログ投稿アプリを開発しているとします。

ユーザーが個々のブログ記事を読むためには、それぞれの記事に対応するURLにアクセスする必要があります。URLパターンは、このとき、どのURLがどのビュー(つまり、どの記事)にマッチするかをDjangoに伝える役割を果たすようなイメージ。

Django urls.py
図1:URLパターン

上記の例で言うと、/AAA というURLをクリックされたら、View A を呼び出すような設定を行っているということ。

この章では上記URLパターンの定義(urls.py)の利用方法・基本を解説します。

Django urls.py とは

Djangoにおけるurls.pyファイルは、ユーザーのブラウザからのリクエスト(URL)を適切なビュー関数にルーティングするための"地図"の役割を果たします。

簡単に言うと、urls.pyはDjangoがユーザーのリクエストをどのように処理すべきかを指示するためのファイルです。

Django urls.py
図2:Django urls.py

urls.pyファイルはPythonのリスト urlpatterns を含んでいます。その中にpath()関数を使ったURLパターンが列挙されています。

参考 Python:リストとは? / 関数とは?

以下が基本的なurls.pyファイルのサンプルコード。

from django.urls import path
from . import views

urlpatterns = [
    path('', views.home, name='home'),
]

参考 import文

上記のコードでは、URLがhttp://yourwebsite.com/(空のパス)であった場合、views.homeというビュー関数が呼び出されるように指示しています。

上記のコードを完全に理解するためには、path関数の使い方をマスターしている必要があります。ここで、path関数の使い方をご説明します。

path関数

path関数の基本的な利用方法は以下の通り。

path(route, view, kwargs=None, name=None)

path関数の引数

  • route:URLパターンを表す文字列。このパターンがユーザーからのリクエストと一致した場合、指定されたビューが呼び出される。
  • view:上記のrouteがマッチしたときに呼び出されるビュー関数。ビュー関数はユーザーのリクエストを処理し、レスポンスを生成する。
  • kwargs:任意のキーワード引数をビューに辞書として渡す(必須ではありません)。
  • name:URLパターンに名前をつけるためのもので、テンプレート内などから参照できます(必須ではありません)。

上記を踏まえて、再度サンプルコードを見てみましょう。

from django.urls import path
from . import views

urlpatterns = [
    path('articles/', views.article_list, name='article_list'),
    path('articles/<int:article_id>/', views.article_detail, name='article_detail'),
]

↑のサンプルコードでは、2つのpath関数が使われています。

1つ目のpath関数は、'articles/'というURLパターンがマッチした場合にviews.article_listというビュー関数を呼び出します。

2つ目のpath関数は、'articles/<int:article_id>/'というURLパターンがマッチした場合にviews.article_detailというビュー関数を呼び出します。このURLパターンは、特定の記事の詳細を表示するためのもので、<int:article_id>という部分は動的な部分(パスコンバータと呼ばれます)で、この部分には記事のIDが入ります。

動的URLについては後ほど詳しく解説します。ここでは、path関数の使い方とその役割が理解できればOK。

re_path関数

path()関数は非常に直感的にURLパターンを記述することが可能です。しかし、複雑なURLパターンを記述する必要がある場合に備えて、Djangoはより強力なツールre_path()関数を提供しています。

この関数はPythonの正規表現を用いてURLパターンを記述することを可能にします。

re_path()関数の基本的な利用方法は以下の通り。

re_path(route, view, kwargs=None, name=None)

この引数はpath()関数のものと同じですが、この際「route」は正規表現を使用した文字列となります。

from django.urls import re_path
from . import views

urlpatterns = [
    re_path(r'^articles/$', views.article_list, name='article_list'),
]

re_path()関数は、'^articles/$'というURLパターンがマッチした場合にviews.article_listというビュー関数を呼び出します。ここで^は文字列の先頭、$は文字列の末尾を意味し、このパターンはarticles/というURLにのみマッチします。

正規表現はうまく利用することで非常に便利なツールとなりますが、その分複雑で覚えることがたくさんあります。しかし、DjangoのURLディスパッチャで正規表現を理解しておくと、より複雑なURLマッチングを柔軟に行うことが可能になるので、この点も頭に入れておくと便利です。

Django:動的URLパターン

Djangoの強力な特性の1つ。それが、URLパターンを動的に生成できることです。これにより、一定のルールに基づいて可変的なURLを作成でき、各URLが特定のビューと一致するようにすることができます。

例えば、ブログ記事の個々のページを表示するためのURLを生成する必要があるとします。記事が何千もある場合、それぞれの記事に対して固定のURLパターンを作成するのは非現実的です。ここで動的URLパターンの利点が生きてきます。

具体的には、URL内の特定の部分をプレースホルダとして扱い、それをビューに渡す引数として利用します。

path('articles/<int:article_id>/', views.article_detail, name='article_detail'),

ここでは、<int:article_id> の部分が動的URLパターンに該当します。

このパターンは、"articles/"に続く整数article_idとして取り扱います。そしてこのarticle_idarticle_detailビューに引数として渡され、そのビュー関数内で特定の記事の詳細を取得するのに使用されるという仕組み。

このように動的URLパターンを使用することで、一つのURLパターンとビューが、任意の数の記事詳細ページを処理できるようになります。

ビュー関数で動的URLパターンを受け取る方法

先ほどのpath関数を、ビュー関数で受け取るには以下のように記述します。

def article_detail(request, article_id):
    # ...

article_detailビュー関数は2つの引数を受け取ります。1つ目のrequestはDjangoから自動的に渡されるHttpRequestオブジェクトで、2つ目のarticle_idはURLから渡されるパラメーターです。

このarticle_idを使うことで、例えばデータベースから特定の記事を取得することができます。

from django.shortcuts import get_object_or_404
from .models import Article

def article_detail(request, article_id):
    article = get_object_or_404(Article, id=article_id)
    # ...

# ここではget_object_or_404関数を使用して
# IDに基づいてArticleオブジェクトを取得。

名前付きURLパターン

Djangoのurls.pyでは、個々のURLパターンに名前をつけることができます

名前をつけると、プロジェクト全体でそのURLを一意に参照することができ、テンプレートやビュー、あるいはリダイレクトの中でその名前を利用してURLを逆引きすることが可能になります。

path('articles/<int:article_id>/', views.article_detail, name='article_detail'),

この例では、name='article_detail'としてURLパターンに名前をつけています。これにより、他の場所から'article_detail'という名前でこのURLパターンを参照できます。

たとえば、ビュー内でredirect関数を使用してリダイレクトを行う場合、URLの名前を使用することができます。

from django.shortcuts import redirect

def create_article(request):
    # ...
    return redirect('article_detail', article_id=new_article.id)

上記は、新規記事を作成した後その記事の詳細ページにリダイレクトさせるサンプルコードです。

ここでは、redirect関数にURLパターンの名前と、必要なパラメーター(この場合はarticle_id)を渡すことで、狙ったURLにリダイレクトさせています。

URL名前空間

大規模なDjangoプロジェクトでは、アプリケーションごとにURL設定を分けることが一般的。

このとき、異なるアプリケーション間でURLの名前が衝突しないようにするために、URL名前空間を利用します。URL名前空間は、アプリケーションごとにURLの名前を分ける概念であり、それぞれのアプリケーションが独自の"スペース"を持つことを可能にします。

具体的にURL名前空間を利用するには、各アプリケーションのurls.pyapp_nameという変数を設定します。

app_name = 'blog'
urlpatterns = [
    path('articles/<int:article_id>/', views.article_detail, name='article_detail'),
    # ...
]

ここでは、app_name'blog'という名前を設定しました。これにより、このurls.pyで定義されるURLパターンは全て'blog'という名前空間に所属します。

この'blog'という名前空間に属したURLの逆引きを行う際には、'namespace:name'という形式でURLの名前を指定します。

return redirect('blog:article_detail', article_id=new_article.id)

この例では、redirect関数に'blog:article_detail'という名前を渡しています。この名前は、'blog'という名前空間の'article_detail'というURLを指しています。

このようにURL名前空間を使用することで、複数のアプリケーション間でURLの名前が衝突することなく、各アプリケーションが独立してURL設定を行うことができます。これにより、大規模なプロジェクトでもURLの管理が容易になります。

Django urls.py のまとめ

  1. Django URLパターン Djangoでは、URLパターンを用いて特定のURLがどのビュー関数にマッピングされるかを定義。path関数を利用したシンプルな文字列マッチングか、re_path関数を利用した正規表現マッチングを利用可能。
  2. 動的URLパターン パスコンバータを用いてURLから特定のパラメータを抽出し、それをビュー関数に渡すことが可能。
  3. 名前付きURLパターン 各URLパターンに名前を付けることで、そのURLをプロジェクト全体で一意に参照することが可能。これにより、URLの変更があったときにも、その名前を使っているすべての場所で自動的に新しいURLに更新される。
  4. URL名前空間 名前空間を設定することで、複数のアプリケーション間でURLの名前が衝突することを避け、各アプリケーションが独立してURL設定を行うことが可能。
## urls.py
from django.urls import path
from . import views

app_name = 'blog'
urlpatterns = [
    path('articles/<int:article_id>/', views.article_detail, name='article_detail'),
]

## views.py
from django.shortcuts import render, get_object_or_404
from .models import Article

def article_detail(request, article_id):
    article = get_object_or_404(Article, id=article_id)
    return render(request, 'blog/article_detail.html', {'article': article})

関連 Djangoテンプレート / render関数

初めてPythonを勉強するのは結構難しいですよね。

でもその悩みを抱えているのは一人じゃありません。全てのPython使いが同じ道を進んできました。

Pythonをはじめとするプログラミングスキルを武器に、時間と場所に捉われない自由な生き方を目指してみませんか?今すぐ行動したい方は以下の記事をチェック!

読者料典 Python入門:学習カリキュラム ←こちらから!

このWebサイトは現役のエンジニアが以下3点を目的として運営しています。

  1. 勉強:一度理解した内容を忘れないように。
    → アウトプットは「最強のインプット」である! 
  2. 備忘:忘れたとしても後から見返せるように。
    → 未来の自分への「お手紙」を書いています。 
  3. 共有:〇〇ってこうだったんだ!の感動をシェアできるように。
    → あなたの知識は誰かにとっての「価値ある情報」です。 

副業ブログの始め方はこちらから

スポンサーリンク
DjangoPython
シェアする
ビズドットオンラインをフォローする
タイトルとURLをコピーしました