TIL

Today I Learned. 知ったこと、学んだことを書いていく

DjangoのURLconfについて

DjangoのURLディスパッチャについて調べたときのメモ

Djangoでの あるリクエストに対してどのビューを返すか という仕組みを理解することが目的。

理解できた!!

以下のようなmysite_url_dispというプロジェクトの中にmyappというアプリケーションがあったとする。

$ tree mysite_url_disp/
mysite_url_disp/
├── manage.py
├── myapp
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
└── mysite_url_disp
    ├── __init__.py
    ├── __pycache__
    │   ├── __init__.cpython-36.pyc
    │   └── settings.cpython-36.pyc
    ├── settings.py
    ├── urls.py
    └── wsgi.py

URLディスパッチャ

あるURLに対してどのビュー関数を返すかを設定する。

DjangoのURLディスパッチャはURLconfという設定ファイルに記述することになっている。DjangoではURLconfはurls.pyというファイルに記述する。

リクエストからレスポンスまでの流れ

  1. リクエストが来る
  2. URLディスパッチャがリクエストに対応するview関数を呼び出す
  3. 呼び出されたview関数がレスポンスを返す

URLconf(urls.py, URLディスパッチャの設定ファイル)の役割

URLconfの役割はviews.py内に定義されているview関数とURLのパターンの対応付けを行うこと

views.py内にview関数が記述されていても、URLconfに記述されていないとページは表示されない。

URLconfは2種類ある

mysite_url_disp/urls.pyにすべてのURLconfを書くことはできるが、アプリケーションごとにURLconfを作ると管理がしやすくなる。

URLconfはプロジェクト用とアプリケーション用の2つを作ること!

  • プロジェクト用のURLconf: mysite_url_disp/urls.py
  • アプリケーション用のURLconf: myapp/urls.py

views.pyの役割

view関数を記述し、リクエストに対してのレスポンスを返す

views.py配下のように記述した

from django.shortcuts import render
from django.http.response import HttpResponse


def index_page(request):
    return HttpResponse('This is url test.')

(views.pyについてはここ以外のところで12/3(日)に調べてまとめる)

URLconfにURLディスパッチャを記述する

まずは、アプリケーションのURLconf(myapp/urls.py)にURLディスパッチャを設定する

from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^$', views.index_page, name='index_page'),
]

views.pyの中に定義されているindex_page()関数を index_page という名前で urlpatterns のリストに追加する

次に、プロジェクトのURLconf(mysite_url_disp/urls.py)にURLディスパッチャを設定する

from django.conf.urls import url, include
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^index/', include('myapp.urls'), name='myapp'),
]

URLが index/ で始まるとき(http://127.0.0.1:8000/index/http://127.0.0.1:8000/index/hello など)、myappのurlsの中に定義されているurlpatternsを見に行くということになる

アクセスしてみる

python manage.py runserver

http://127.0.0.1:8000/index/ にアクセスしてみると、views.pyのindex_page()に記述した文字列が表示される。

urlpatternsについて

urls.py内にurlpatternsというものがある

これはDjangoによって、URLにマッチする定義があれば、そのview関数を呼び出すという動作をする。ページを追加するときにはurlpatternsにURLパターンを追加する!

urlpatternsについてわかったかも!

それぞれのURLconf内のurlpatternsが以下のようになってたとする

# myapp/urls.py
urlpatterns = [
    url(r'^$', views.index_page, name='index_page'),
    url(r'^hello', views.hello_page, name='hello_page'),
]
# mysite_url_disp/urls.py
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^index/', include('myapp.urls'), name='myapp'),
]

リクエストのURLによって、動作が変わる


参考文献