【Django】urls.py:ルーティングの書き方(urlpatterns、path、include)

2021.07.04 /

【Django】urls.py:ルーティングの書き方(urlpatterns、path、include)

本記事ではDjangourls.pyに記入する、ルーティングの書き方を詳しく解説していきます。

Pythonを使用したWebフレームワークDjangoでは、次のように動作します。

HTTPリクエストとHTTPレスポンスの流れ
  1. ブラウザはサーバーにHTTPリクエストを送信
  2. urls.pyから一致するURLパターンを検索
  3. 一致したURLパターンに紐づいているviews.py内の関数を実行
  4. 関数はモデル(models.py)を通してデータベース操作を行いデータを取得
  5. templateフォルダからtemplate_nameで指定されているテンプレートを取得
  6. データベースのデータ(context)をテンプレートに反映
  7. 作成されたHTMLをHTTPレスポンスでブラウザに返す

本記事では2,3で使用するurls.pyのルーティングについて解説しています。

本記事を通して以下の知識を学べます。

学べる知識
  • urls.pyの動作について
  • urlpatternsについて
  • urls.pyで使用する関数について(path、include)

urls.py

urls.pyとは

urls.pyはブラウザから送られるHTTPリクエストに対して、どのページを表示するかという指示を記載します。

より詳しく解説すると、どのページ(テンプレート)を表示するかはviews.py内に記述し、urls.pyにはviews.py内のどの関数を実行するかを記述します。

このことをルーティングといいます。

ルーティングを図に表すと次のようになります。

Django:urls.pyのルーティング

このルーティングを実際にプログラミングする方法を次項から解説していきます。

urls.pyの例(プロジェクトとアプリケーション)

urls.pyはプロジェクト内と各アプリケーション内に存在します。

Django:urls.pyの保存場所

アプリケーションのurls.pyは自動で作成されないため、自身で作成する必要があります。

それぞれのurls.py例を以下に記します。

urls.py:プロジェクトフォルダ

from django.contrib import admin
from django.urls import path, include

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

プロジェクトフォルダのurls.pyには、デフォルトでは管理画面のルーティングであるpath('admin/', admin.site.urls)のみが記述されています。

上記ではアプリケーションfiveのurls.pyを連結する記述が追加されています。

urls.py:アプリケーションフォルダ(five)

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
path('test/', views.index, name='test'),
]

HTTPリクエストから送られたURLにマッチするパスをurls.pyから探します。

マッチするパスを探すときはプロジェクトフォルダのurls.pyを上から順番に探していきます。

urlpatterns

urlpatternsという変数には、リスト型で「URL」と実行する「関数またはクラス」を指定します。
つまりurlpatternsのリスト内にルーティングを記載するということです。

ブラウザから送られたHTTPリクエストのURLと、urlpatternsに格納されたルーティングを順番に比較していきます。

urlpatternsに指定するURLや関数はpath関数を使用します。

path関数

urls.pyで使用するpath関数は、次のように使用します。

path(URL, 関数またはクラス, name=URL名称)

第一引数にはURLを指定し、第二引数には関数を指定します。
HTTPリクエストからリクエストされたURLに対応する関数またはクラスが実行されます。

プロジェクト内のurls.pyではこの後解説するinclude関数も指定します。

第二引数:関数またはクラス

path関数の第二引数には、views.pyの関数やクラスを指定します。

# 関数ベースビューの場合
path(URL, views.関数名, name=URL名称)
# クラスベースビューの場合
path(URL, views.クラス名.as_view(), name=URL名称)

name引数

name引数でURLの名称を指定できます。
そうすることにより、テンプレート内やviews.pyでその名称でURLを指定できるようになります。

nameで指定したURL名称は主に以下3つのパターンで使用されます。

  • テンプレート:aタグのhref属性で指定
  • views.py:redirectで使用
  • views.py:reverseで使用

以下にテンプレートのaタグで使用した場合の例を記します。

# name引数で指定したURL名称の使用例 name= 'office54'の場合
<a href="{% url 'office54' %}">

aタグのhref属性に{% url 'URL名称' %}として指定します。

name引数を使うメリットとしては、指定が簡単であるということ。
そしてURLを変更してもname引数を変更していなければ、テンプレートやviews.py側を変更する必要がないということです。

include関数

path関数の第二引数にinclude関数を使うことができます。
include関数により、アプリケーション内のurls.pyを連結することができます。

引数にはアプリケーションフォルダ内のurls.pyを指定します。

path(URL, include(アプリケーションフォルダ名.urls))

include関数は主にプロジェクト内のurls.pyに使用します。

# プロジェクトフォルダのurls.py
path('', include('five.urls'))
# アプリケーションフォルダのurls.py
path('', views.index, name='index'),
path('test/', views.test, name='test'),

上記のプロジェクトフォルダでは、include関数でアプリケーションfive内のurls.pyを指定しています。

「https://ドメイン名/test/」にアクセスがあると、views.pyのtest関数が実行されます。

まとめ

本記事「【Django】urls.py:ルーティングの書き方(urlpatterns、path、include)」はいかがでしたか。

urls.pyのルーティング設定が間違っているとエラーが発生し、ページが表示されなくなります。

Djangoのルーティングを理解して、Webアプリケーションの開発を進めてください。