はじめに
Djangoを理解するためにはルーティングを理解することは大事だと思いましたので、自分の頭の中を整理するためにも書いていきます。
ルーティングとは
リクエストに応じて、Djangoプロジェクト内でどのような処理経路を辿らせるかを指定するものです。簡単に言うとネットワーク上で行われる道案内です。
urls.pyの役割
ルーティングは総称ですが、urls.pyは実際にコードを書いて指示を出します。urls.pyの役割はブラウザから送られるHTTPリクエストに対して、どのページを表示するかという指示を記載することです。実際にはviews.py内のどの関数を実行するか記載し、views.pyがどのページを表示するかを記載しています。
ルーティングにはプロジェクトルーティングとアプリケーションルーティングの2種類があります。実際には分けなくても動作上は問題ありませんが、管理をすることが大変になりますので分けています。
プロジェクトルーティング
プロジェクトルーティングはサーバーからHTTPリクエストを受け取ってアプリケーションルーティングへ繋ぎます。なのでHTTPリクエストがあった際に一番初めに問い合わせがあります。urls.pyでどのアプリケーションに引き渡すかを指定します。
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('アプリケーション名.urls')),
]
include関数
path関数の第二引数にinclude関数は使うことができます。
include関数で、アプリケーション内のurls.pyを連結させます。引数にはアプリケーションフォルダ内のurls.pyを指定します。簡単にいうとHTTPリクエストがあった場合、view.pyなどの処理をせずにそのまま指定した値へ繋ぎます。なのでinclude関数は主にプロジェクト内のurls.pyに使用し、HTTPリクエストがあった場合はプロジェクトルーティング→アプリケーションルーティングへ処理を受け渡します。
path(URL, include(アプリケーションフォルダ名.urls))
アプリケーションルーティング
アプリケーションルーティングはプロジェクトルーティングから引き継いで指定したviewに渡し、viewで処理されたものがHTML形式でWebページに反映されます。urls.pyではどのviewのどの関数に引き渡すか指定します。
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
path('test/', views.index, name='test'),
]
path関数
path(URL, views.関数またはviews.クラス, name=URL名称)
第一引数にURLを入れます。この第一引数はrequestを受けた時の受け皿となります。例えば、もともと表示されているページから表示したいページを開くためのrequestが来ます。上記画像のリクエストです。それを基にプロジェクトルーティングを辿りますが、同じアプリケーション内ではそのまま進み、アプリケーションルーティングにいきます。アプリケーションルーティングに対応するのがurls.pyです。その中のpath関数の中の第一引数とrequestがマッチするものを選びます。
第二引数のviews関数またはviewsクラスを処理したいものを指定します。(include関数も第二引数として入ります。)
第三引数は第一引数と同じで受け皿です。ここで違うのはURLではなく任意のURL名称をつけることで、もともと表示されているhtml側で表示したいhtmlのURLを全部書く必要がないことです。なのでrequest時にURL名称でも探すことができます。
#指定したい処理が関数の場合
path(URL, views.関数名, name=URL名称)
#指定したい処理がクラスの場合
path(URL, views.クラス名.as_view(), name=URL名称)
まとめ
ルーティングを理解できるとDjangoのフレームワークの理解につながります。私もエラー発生時にどこに問題があったか判別するときに役立ちました。ルーティングは流れなのでコードを書く際にも実装していくときにイメージしやすくなりました。