djangoでよく「request.method==‘POST’」を使っている例文を見かけますよね。
このPOSTとかmethodってなに?と思う方に向けて
GET・POST・request.methodについて解説します。
ざっくり解説 〜GET/POST/request.method
Djangoの公式サイトの例をあげます。
if request.method == 'GET':
do_something()
elif request.method == 'POST':
do_something_else()
この例ではrequest.methodが
GETなのかPOSTなのかで処理を判断しています。
ではまず、request.methodに関して説明します。
request.method
公式サイトの説明では
リクエストで使用された HTTP メソッドを表す文字列です。
Django 公式サイト(https://docs.djangoproject.com/ja/3.1/ref/request-response/#django.http.HttpRequest.method)
この値は常に大文字となることが保証されています。
ん?どういうこと?
解説が突飛すぎて混乱すると思います。
request.methodを解説するにあたって
まず、インターネットのやりとりに関して簡単に説明します。
例えば、インターネットでWebページを見る場合
Webページを持っているサーバに対して、そのページを見るとリクエストします。
つまり、ユーザとサーバとのデータのやり取り(リクエスト)が存在します。
そのやり取りの種類は複数あります。ざっとメインの4つだけ。
- GET :データを受け取る・見る
- POST:データを送信する
- PUT :データを更新する
- DELETE:データを削除する
このデータのやり取りの種類・方法をHTTPメソッドといい
先ほどのリクエストの中にHTTPメソッドが入っています。
このHTTPメソッドはデフォルトでGETですが
データの送信などにはPOSTを使用します。
そのため、上記の例ではrequest.method == ‘POST’として
データの送信されたかを確認していました。
GET・POSTの違い
さきほどGETはデータを受け取る・見る。
POSTはデータを送信すると書きましたが
Web開発する場合はより細かな定義まで確認しておきましょう。
GETの詳細
- HTTP通信でサーバから情報を取得する時に使用
- URL上にテキストデータのみ送信できる
- 他人に見られたくない情報はGETでは送らないようにする
GETでもデータの送信ができます。しかし、URL上になるため
”http://www.kuma-server.com/x=123”のようになります。
これだと情報がバレバレですね。セキュリティ上、危険です。
そのためにPOSTが存在します。
POSTの詳細
- HTTP通信でサーバへ情報を蟷螂する時に使用する(データベースへの格納など)
- データ量が多くてもOK
バイナリーデータも送信できる - 他人に見られたくない情報を送るのに最適
POSTはGETと異なり、リクエストのヘッダーフィールドの後の
ボディ部分にデータを追加して送ることができ、
情報を外部に見られる機会を減らします。
POST /hoge/ HTTP/1.1
Host: localhost:8080
:
Accept-Encoding: gzip, deflate, br
Accept-Language: ja,en-US;q=0.8,en;q=0.6
x=123 #ここでデータを送信
実例
Django上にSampleFormを作成し、そのフォームから’POST’で送られてきたデータ(ラベル1、ラベル2)が問題なければ、データベース上に保存するコードです。
def sample(request):
form = SampleForm(request.POST or None)
if request.method == 'POST':
if form.is_valid():
SampleModel.objects.create(**form.cleaned_data)
return redirect('success')
return render(request,'sample.html')
前略
<form action='' method='POST'>{% csrf_token %}
<label>ラベル1</label>
<input type="text">
<label>ラベル2</label>
<input type="text">
<button type="submit">提出</button>
</form>
後略
クラスベースビューでの使い方
上記の例は関数ベースビューでのGET/POSTの書き方でした。
クラスベースビューの書き方だとこんな感じです。
いろいろと省略しています。
class MyFormView(View):
form_class = SampleForm
template_name = 'sample.html'
def get(self, request, *args, **kwargs):
form = self.form_class(initial=self.initial)
return render(request, self.template_name, {'form': form})
def post(self, request, *args, **kwargs):
form = self.form_class(request.POST)
if form.is_valid():
return HttpResponseRedirect('/success/')
return render(request, self.template_name, {'form': form})