導入
Web アプリは、たいてい複数のページを持ちます。トップ、会社概要、お問い合わせ……。それぞれの URL に対応するビューを、Django では urlpatterns という表にまとめて登録します。
説明
path("URL", ビュー) を並べたリストが URL 表です。Django はリクエストが来ると、この表を上から順に照らし合わせ、最初に一致した URL のビューを呼びます。
import django
from django.conf import settings
if not settings.configured:
settings.configure(DEBUG=True, SECRET_KEY="dev",
ROOT_URLCONF=__name__, ALLOWED_HOSTS=["testserver"])
django.setup()
from django.http import HttpResponse
from django.urls import path
def home(request):
return HttpResponse("ホーム")
def company(request):
return HttpResponse("会社概要")
def contact(request):
return HttpResponse("お問い合わせ")
urlpatterns = [
path("", home), # /
path("company/", company), # /company/
path("contact/", contact), # /contact/
]
from django.test import Client
client = Client()
for url in ["/", "/company/", "/contact/"]:
print(url, "->", client.get(url).content.decode())
- URL は先頭の
/を書きません("company/")。末尾の/は付けるのが Django の作法です。 - 存在しない URL(例:
/nothing/)にアクセスすると、Django は自動的に 404 Not Found を返します。あとで確かめます。
やってみよう
for ループの URL リストに "/nothing/" を足して実行してみましょう。登録していない URL なので、そのビューは呼ばれず、client.get("/nothing/").status_code は 404 になります(本文の代わりにステータスを見てみましょう)。
演習
/price/ にアクセスすると 料金プラン を返すビュー price を作り、urlpatterns に登録してください。最後に print(client.get("/price/").content.decode()) で確認します。
ヒント1を見る
def price(request): return HttpResponse("料金プラン")。
ヒント2を見る
urlpatterns に path("price/", price) を追加します。