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]を参照してください。