【Django】GET・POSTの役割について

Django

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})

タイトルとURLをコピーしました