URLディスパッチャ
URLディスパッチャは、URLconfに記述されたurlpatternsに基づき、要求されたURLに対応したビュー関数を呼び出す役割を担います。それでは、http://localhost:8000/にアクセスされたとき、どのような流れでトップページが表示されたのか、リストを追いながら見ていきましょう。
リスト1: recsys_django/recsys_django/settings.py
...(略)...
ROOT_URLCONF = 'recsys_django.urls'
...(略)...
まず、recsys_django/recsys_django/settings.pyには、ROOT_URLCONF = 'recsys_django.urls'という記述があります。そのため、http://localhost:8000/にアクセスされると、最初にrecsys_django/recsys_django/urls.pyのurlpatternsを見にいきます。
リスト2: recsys_django/recsys_django/urls.py
...(略)...
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('online.urls')),
]
このurlpatternsにはpath()関数があります。このpath()関数の第1引数がURLパターンを表しています。要求されたURLと一致するまで、このURLパターンを上から順にマッチングしていきます。ただし、このURLパターンにはドメイン名(今回の場合、http://localhost:8000/の部分)は含みません。つまり、ここでは、''(空文字列)として二つ目のURLパターンに一致することになります。
一致するURLパターンを見つけると、次はpath()関数の第2引数に指定されたビュー関数を呼び出します。ただし、ここではinclude('online.urls')となっています。include()関数は、他のURLconfを参照することを表します。'online.urls'と記述されていますので、今度はrecsys_django/online/urls.pyのurlpatternsを見にいくことになります。この際、要求されたURLの中で既に一致した部分は取り除かれたうえで、次のURLconfに渡されます。ここでは、そのまま''がonline/urls.pyのURLconfに渡されます。
リスト3: recsys_django/online/urls.py
...(略)...
app_name = 'online'
urlpatterns = [
path('', views.IndexView.as_view(), name='index'),
]
要求されたURLを''として、同様にURLパターンをマッチングしていきます。ここでは、''のURLパターンに一致しますので、第2引数のviews.IndexView.as_view()が呼ばれることになります。今回の例では、インデックスビューをIndexViewというクラスで定義しています。as_view()は、そのクラスベースのビューをビュー関数化するためのメソッドです。そして、このIndexViewクラスのget()メソッドが呼び出されます。
リスト4: recsys_django/online/views.py
...(略)...
class IndexView(View):
"""インデックスビュー
Attributes
----------
context: dict
コンテキスト
"""
def __init__(self):
self.context = {}
def get(self, request, *args, **kwargs):
"""index.htmlをレンダリングしたレスポンスを取得する。
Parameters
----------
request : WSGIRequest
リクエスト
Returns
-------
HttpResponse
index.htmlをレンダリングしたレスポンスを返す。
"""
return render(request, 'index.html', self.context)
recsys_django/online/urls.pyのapp_nameおよびpath()関数の引数nameはURLの逆引きに用いられます。app_nameにはアプリケーション名を設定しておくと良いでしょう。ここでは、app_name = 'online'としています。また、引数nameはurls.py内でユニークな値に設定しておく必要があります。ここでは、IndexViewに対応する名前として'index'を設定しています。
path()関数、include()関数、View.as_view()メソッドの詳細については、それぞれ文献[1][2][3]を参照してください。URLディスパッチャとURLconfの詳細については、文献[4][5]を参照してください。