View on GitHub

URLディスパッチャ

Home

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.pyurlpatternsを見にいきます。

リスト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.pyurlpatternsを見にいくことになります。この際、要求されたURLの中で既に一致した部分は取り除かれたうえで、次のURLconfに渡されます。ここでは、そのまま''online/urls.pyURLconfに渡されます。

リスト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.pyapp_nameおよびpath()関数の引数nameはURLの逆引きに用いられます。app_nameにはアプリケーション名を設定しておくと良いでしょう。ここでは、app_name = 'online'としています。また、引数nameurls.py内でユニークな値に設定しておく必要があります。ここでは、IndexViewに対応する名前として'index'を設定しています。

path()関数、include()関数、View.as_view()メソッドの詳細については、それぞれ文献[1][2][3]を参照してください。URLディスパッチャとURLconfの詳細については、文献[4][5]を参照してください。

参考

  1. django.urls functions for use in URLconfs | Django ドキュメント | Django # path()
  2. django.urls functions for use in URLconfs | Django ドキュメント | Django # include()
  3. Base views | Django ドキュメント | Django # View.as_view()
  4. URL ディスパッチャ | Django ドキュメント | Django
  5. 現場で使える Django の教科書《基礎編》 # 第4章 URLディスパッチャとURLconf