本文へスキップ
BecomeCoder

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

GETとPOST ― HTTPメソッドで分岐する

ブラウザで完結

導入

同じ URL でも、「ページを見る(GET)」のか「フォームを送信する(POST)」のかで、やりたいことは違います。Django では request.method を見て処理を分けます。

説明

HTTP にはメソッドという「リクエストの種類」があります。代表は次の2つです。

  • GET … 情報を「取得」する(ページを開く、検索するなど)。安全で、何度呼んでも状態を変えない。
  • POST … 情報を「送る・作る」(フォーム送信、投稿など)。サーバーの状態を変える。

テストクライアントでは client.get(...)client.post(...) で使い分けます。

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

memos = []  # 投稿を貯める箱(本来はデータベース)

def board(request):
    if request.method == "POST":
        text = request.POST.get("text", "")
        memos.append(text)
        return HttpResponse(f"投稿しました: {text}")
    # GET のとき:今までの投稿を一覧表示
    return HttpResponse("投稿一覧: " + " / ".join(memos))

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

from django.test import Client
client = Client()
print(client.get("/board/").content.decode())                  # 投稿一覧:(まだ空)
print(client.post("/board/", {"text": "はじめての投稿"}).content.decode())
print(client.post("/board/", {"text": "2件目"}).content.decode())
print(client.get("/board/").content.decode())                  # 投稿一覧: はじめての投稿 / 2件目
  • client.post(URL, {データ}) で POST リクエストを送ります。送ったデータはビューの request.POST から読めます。
  • if request.method == "POST": で「送信されたとき」と「ただ見に来たとき」を分けています。これは Django の定番の書き方です。

やってみよう

client.post("/board/", {"text": "..."}) の文字を変えて何度か投稿し、最後の client.get("/board/") で一覧が増えていくのを確かめましょう。

演習

board ビューを改造して、POST のとき返すメッセージを 保存OK: ○○(○○は送信されたテキスト)に変えてください。print(client.post("/board/", {"text": "テスト"}).content.decode()) で確認します。

ヒント1を見る

POST 側の return HttpResponse(...) の文言だけを f"保存OK: {text}" に変えます。

実際に動かしてみよう

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

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

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