djangoでfunction based viewで書かれたコードを見ていると、request.method == 'POST'といった表示を見ることがあるかと思います。
ただ、これが何のかよくわからない。何となくしっくりこない。という方も多いのではないでしょうか。
そこで今回は、request.method=='POST'を解くカギであるPOSTとGETの違いについてお伝えしていきます。
POSTとGETはブラウザがリクエストを送る方法
結論からお伝えすると、POSTとGETはブラウザがリクエストを送る方法のことです。
ただ、これでも全然意味が分からないですよね。そこでここからは、その内容について具体例を使ってみていこうと思います。
POSTとGETは、牛丼屋で「店内」か「持ち帰り」かを選択するようなイメージ
最初にお伝えしますが、今回ご紹介する具体例は、あくまでも例であって、厳密な解釈ではないことをお含みおき下さい。
POSTとGETは技術的な定義の違いもありますが、その定義を理解してもDjangoでPOSTとGETを使いこなせるようにはならないということは、まず頭に入れておくと良いかもしれません。
その上で、POSTとGETの具体例についてみていきましょう。
POSTとGETの違いは、牛丼屋で「店内」か「持ち帰り」かを選択するようなイメージです。
これがどういった意味なのか、ここから見ていきましょう。
注文の仕方によって処理を変えている
牛丼屋の場合、店内であっても持ち帰りであっても、牛丼を食べに来たことに変わりはありません。
ただ、「店内」にすると、牛丼は陶器の器に入れられ、「持ち帰り」にすると、牛丼は持ち帰り用の容器に入れられますよね。
店員の立場からすると、店内か持ち帰りかが分からないと、どちらの容器に入れて良いかが分かりません。
違う見方をすると、「店内」か「持ち帰り」かを事前に知ることによって、店員は効率的に処理を進めることができます。
このように、注文の仕方を分類することによって、そのあとの処理に違いをつけている。というイメージを頭に入れておきましょう。
POSTとGETの違い
牛丼屋のイメージを持った上で、DjangoにおけるPOSTとGETの違いについてみていきましょう。
POSTとGETは、ブラウザがサーバーにリクエストを送るときに使えるmethodの種類の一つです(他にもPUTなどがあります)。
そして、ブラウザにリクエストが送られるときには、methodに関する情報も一緒に送られます。
その上で、ウェブサーバーがリクエストを受けると、そのリクエスト(methodに関する情報も含みます)がDjangoに送られ、Djangoの中でmethodに応じた処理が行われます。
つまり、Djangoも牛丼屋と同じように、methodの種類によって内部で実行する処理を使い分けているのです。
POSTとGETが使われる場面
次に、ウェブ上においてPOSTとGETが使われる場面について理解を深めていきましょう。
GETが使われる場面
携帯やパソコンでブラウザを開き、何らかのサイトを開いた時、この時も知らない間にmethodを指定しています。
そのmethodは「GET」です。
また、ウェブサイトの中のリンクをクリックして他のサイトに移動する時も、使われるmethodは「GET」です。
つまり、基本的使われるmethodは「GET」というイメージを持ちましょう。
POSTが使われる場面
次に、POSTが使われる場面です。
POSTが使われる場面は、問い合わせフォームやユーザー登録など、ブラウザ上で何らかの情報をサーバーに送る場面です。
htmlファイルのformタグでmethodを指定することができるのですが、問い合わせフォームなどのformを作る場合はmethodはPOSTにすることが一般的です。
POSTとGETの使い分けについて頭に入れた上で、実際にDjangoにおいてどのようにこの二つが使われるかという点についてみていきましょう。
POSTとGETの具体例
ここから、POSTとGETが使われる具体的な場面について、具体例でみていきましょう。
お問い合わせフォームを作った場合を考えてみましょう。
お問い合わせに対応したviewでは、methodがPOSTの場合にだけ、受け取ったデータをメールとして送信するという機能を付けたとしましょう。
ここで、ある人がウェブサイトを回り、お問い合わせフォームにアクセスしたとしましょう。
この時は、methodはGETですので、メールを送るという機能は実行されません。
そして、この人が必要事項を入力して「送信」ボタンを押したとします。
さらに、送信ボタンが押された後には同じviewが呼び出されるとします。
すると、このviewは今度はmethodがPOSTなので、viewの内部の処理が実行され、結果としてメールが送信される。という流れになるのです。
POSTとGETのまとめ
(1) POSTとGETは牛丼屋の「店内」と「持ち帰り」のイメージ
(2) methodによって、Django内部で行う処理が変わる
(3) ウェブサイトはデフォルトではGETメソッド。お問い合わせフォームなどではPOSTメソッド
(4) フォームの送信ボタンを押して同じviewを呼び出すようにすれば、methodがPOSTであることから、内部の処理が実行される