本文へスキップ
BecomeCoder

Djangoコース · 第2章 URLとビュー · レッスン7

リクエストの中身 ― HttpRequest と request.GET

ブラウザで完結

導入

/search?q=python&page=2 のように、URL の末尾に ?キー=値 を付けて情報を渡すことがあります。これをクエリ文字列と呼び、ビューでは request.GET から読み取ります。

説明

ビューの第1引数 request は、リクエストの情報が詰まった HttpRequest オブジェクトです。よく使うのは次のあたりです。

  • request.method"GET""POST" などの HTTP メソッド
  • request.GET … クエリ文字列(?q=...)を辞書のように読む
  • request.path … リクエストされたパス(/search/ など)
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 search(request):
    # ?q=... が無ければ "" を既定値にする
    q = request.GET.get("q", "")
    page = request.GET.get("page", "1")
    return HttpResponse(f"method={request.method} 検索語={q} ページ={page}")

urlpatterns = [
    path("search/", search),
]

from django.test import Client
client = Client()
print(client.get("/search/?q=python&page=2").content.decode())
print(client.get("/search/").content.decode())  # クエリ無し

request.GET.get("q", "") は「q があればその値、無ければ ""」という意味です。request.GET["q"] でも取れますが、キーが無いとエラーになるため、.get(キー, 既定値) を使うのが安全です。

やってみよう

client.get("/search/?q=django") のように q の値を変えて実行し、出力の「検索語」が変わることを確かめましょう。page を省略すると既定値の 1 になります。

演習

/hello/ にアクセスしたとき、?name=... があればその名前で「こんにちは、○○さん」、無ければ「こんにちは、ゲストさん」と返すビュー hello を作ってください。print(client.get("/hello/?name=Aki").content.decode()) で確認します。

ヒント1を見る

name = request.GET.get("name", "ゲスト")

ヒント2を見る

return HttpResponse(f"こんにちは、{name}さん")

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

Python — ライブラリ付きで実行(Pyodide)

numpy / pandas / matplotlib が使える本物のPython(Pyodide)を読み込みます。初回のみ読み込みに少し時間がかかります(以降はブラウザにキャッシュされます)。
スクロールして表示された時点でも自動で読み込まれます。