Djangoの中心的な要素であるurls.py
は、ユーザがアクセスしたURLを適切なビュー関数に接続する役割を担います。
この記事では、urls.py
の設定方法と、DjangoのURLルーティングがどのように動作するかを詳しく解説。Djangoアプリケーションを利用し、適切なURL設計を行うための知識を深めていきましょう。
Pythonエンジニア/Djangoを利用したWeb開発者を目指す方であれば知らないと恥ずかしい超・基本知識の1つ。是非最後までご覧ください。
Django:URLパターンの基本
DjangoにおけるURLパターンの設定は、Webアプリケーションがユーザーのリクエストにどのように応答するかを定義する重要な設定です。このセクションでは、urls.py
ファイルの役割と、基本的なURLパターンの作り方を解説します。
Django urls.py とは
Djangoにおけるurls.py
ファイルは、ユーザーのブラウザからのリクエスト(URL)を適切なビュー関数にルーティングするための"地図"の役割を果たします。
簡単に言うと、urls.py
はDjangoがユーザーのリクエストをどのように処理すべきかを指示するためのファイルです。
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_id
がarticle_detail
ビューに引数として渡され、そのビュー関数内で特定の記事の詳細を取得するのに使用されるという仕組み。
このように動的URLパターンを使用することで、一つのURLパターンとビューが、任意の数の記事詳細ページを処理できるようになります。
名前付き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.py
でapp_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 のまとめ
初めてPythonを勉強するのは結構難しいですよね。
でもその悩みを抱えているのは一人じゃありません。全てのPython使いが同じ道を進んできました。
Pythonをはじめとするプログラミングスキルを武器に、時間と場所に捉われない自由な生き方を目指してみませんか?今すぐ行動したい方は以下の記事をチェック!
読者料典 Python入門:学習カリキュラム ←こちらから!