導入
同じ 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}" に変えます。