概要
DjangoドキュメントのチュートリアルPart3では、ビューへのルーティングやテンプレートの使い方などが詳しく書かれているが、このうちURLconf~ルーティングの部分を整理する。
view関数の定義
まず、polls/views.py
ファイルに3つのview関数(detail
, results
, vote
)を追加する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
from django.shortcuts import render from django.http import HttpResponse def index(request): return HttpResponse("Hello, world. You're at the polls index.") def detail(request, question_id): return HttpResponse("You're looking at question %s." % question_id) def results(request, question_id): response = "You're looking at the results of question %s." return HttpResponse(response % question_id) def vote(request, question_id): return HttpResponse("You're voting on question %s." % question_id) |
いずれのビューでも動作の本質は同じ。
- リクエストからパラメーターを
question_id
として受け取る - 各ビューで想定している処理の内容に即したテキストを
HttpResponse
で返す - その際、
question_id
の値もテキストに含めて返す
なおテキストにquestion_id
の内容を文字列として含めるために、Pythonの構文を使っている。
"... %s ..." % 変数
urls.pyの設定
追加したview関数をこれに対応したURLリクエストから呼び出すため、ルーティングを追加する。
いずれのルーティングもpolls
アプリケーションのビューに関するものなので、最初に作成したpolls/urls.py
に追記する。
1 2 3 4 5 6 7 8 9 |
from django.urls import path from polls import views urlpatterns = [ path('', views.index, name='index'), path('<int:question_id>/', views.detail, name='detail'), path('<int:question_id>/results/', views.results, name='results'), path('<int:question_id>/vote/', views.vote, name='vote'), ] |
確認
サーバー起動状態で各URLを入力したとき、呼ばれるview関数とブラウザー上の文字列は以下のとおり。
http://localhost:8000/polls/34/
→views.detail
→You’re looking at question 34.http://localhost:8000/polls/34/results/
→views.results
→You’re looking at the results of question 34.http://localhost:8000/polls/34/vote
→views.vote
→You’re voting on question 34.
URLconf~ルーティングの仕組み
たとえばhttp://ドメイン名/polls/34/
というURLでリクエストがあった時、Djangoは以下のように解釈を始める。
settings.py
のROOT_URLCONF
の設定に従って、config.urls
モジュールを読み込む(モジュールファイルはconfig/urls.py
)- urlsモジュール中のurl_patterns配列から、パターンを1つずつ順に走査していく
- URLパターンが
'polls/'
パターンまでマッチした時、それ以前のパターンを取り除いて、polls.urls
モジュールを読み込む polls.urls
モジュールでURLパターンの'<int:question_id>/'
パターンまでマッチしてその後がないとき、これに対応するviews.detail
モジュールを呼び出す- detailモジュールでは
<int:queston_id>
の内容が引数のquestion_id
に渡され、ビュー内での処理に使われる
なおsettings.py
のROOT_URLCONF
はデフォルトで以下のように書かれていて、まずconfig.urls
が読み込まれるようになっている。
1 |
ROOT_URLCONF = 'config.urls' |
またconfig.urls
は、チュートリアルの最初の方で以下のように編集済み。
1 2 3 4 5 6 7 |
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('polls/', include('polls.urls')) ] |
またパラメーターについては<int:question_id>
と定義されているので、localhost:8000/polls/abc/
のようにパラメーターが整数として解釈されない場合にはパスが見つからず、Page not foundエラーになる。