PythonでWebプログラミングの基礎(その6)CGIでパラメータを取得する

PythonでWebプログラミングの基礎を学習するというテーマで書いています。今回はCGIでパラメータを取得するプログラムを書きました。このパラメータについてです。

パラメータとは何かということですが、ここではHTTPのGETメソッドやPOSTメソッドでリクエストに付加する情報のことです。そのあたりの内容は以下で書きました。今回は以下の内容がベースになっています。
PythonでWebプログラミングの基礎(その4)HTTPの理解

実際にやってみます。

HTMLページからパラメータ表示の流れ
今回は以下のようなページを作成してHTTPリクエストを送信します。

お名前とハンドル名をパラメータとして取得して表示しています。

HTMLページとCGIプログラムの構成
上記の流れを以下のようなファイル構成で実行しています。

index.htmlがリクエストを送信するHTMLファイルです。
parameter.pyがリクエストを表示しているCGIプログラムです。
(※CSSファイルについては前回書きました。)

このHTMLファイルとCGIプログラムを順番に見ていきます。

パラメータを送信するページ(index.html)
パラメータ(HTTPリクエスト)を送信するページです。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset=utf-8 />
<title>CGIパラメータ取得</title>
<link rel="stylesheet" href="./style.css">
</head>
<body>
<header class="header">
   <p>CGIでパラメータ取得(GET Method)</p>
</header>

<div class="content">
お名前とハンドル名を入力して送信ボタンをクリックして下さい。
<form name="cgiprm"
      method="get"
      action="cgi-bin/parameter.py"
      accept-charset="UTF-8">

      お名前:<input name="username" type="text"></br>
      ハンドル名:<input name="handlename" type="text"><input type="submit" value="送信">
</form>
<br>
移動したページでパラメータを確認して下さい。
</div>
</body>
</html>

HTMLのフォームを使ってGETメソッドでパラメータと共にparameter.pyへリクエストを送信しています。パラメータはお名前がusernameでハンドル名がhandlenameです。

パラメータを取得するCGIプログラム(parameter.py)
パラメータを受け取って表示するCGIプログラムが以下です。

#!/usr/bin/env python3

htmlText = '''Content-type: text/html; charset=UTF-8

<html>
<head>
  <title>CGIパラメータの取得</title>
  <link rel="stylesheet" href="../style.css">
</head>
<body>
<header class="header">
   <p>取得したパラメータ</p>
</header>
<div class="content">
<p>%s(%s)さん、よろしくお願いします。</p>
</div>
</body>
</html>
'''

import cgi

form = cgi.FieldStorage()
uname = form.getvalue('username','')
hname = form.getvalue('handlename','')
print(htmlText % (uname, hname))

cgiモジュールが使えるのでインポートして使います。これを使えばCGIの細かい仕様まで考えてプログラミングをしないでもパラメータが比較的簡単に取得出来ます。

ここでは、usernameとhandlenameというパラメータを個別に取得してHTMLテキスト(文字列)に組み込んでいます。そのHTMLテキストをレスポンスとして表示しています。

URLでGETメソッドを確認する
表示結果のURLを見ると以下のように表示されています。
http://localhost:8000/cgi-bin/parameter.py?username=%E5%B1%B1%E7%94%B0%E5%A4%AA%E9%83%8E&handlename=YTaro
これは、GETメソッドの場合は、URLの後ろにパラメータが付加して送信されるという仕様になっているということです。山田太郎はURLエンコード(日本語の漢字ではなく英数字とパーセントでの表記)されています。

ここではGETメソッドではURLの後ろにパラメータが付加されるということ確認します。以下のようなURLを直接ブラウザへ入力します。
http://localhost:8000/cgi-bin/parameter.py?username=TaroYamada&handlename=TY
以下のようにパラメータの内容が問題なく認識されました。(※クリックで拡大表示出来ます。)

パラメータを送信するページをPOSTメソッドに変更する
それではPOSTメソッドの場合はどうなるのかということです。最初のHTMLページを以下のように変更します。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset=utf-8 />
<title>CGIパラメータ取得</title>
<link rel="stylesheet" href="./style.css">
</head>
<body>
<header class="header">
   <p>CGIでパラメータ取得(POST Method)</p>
</header>

<div class="content">
お名前とハンドル名を入力して送信ボタンをクリックして下さい。
<form name="cgiprm"
      method="post"
      action="cgi-bin/parameter.py"
      accept-charset="UTF-8">

      お名前:<input name="username" type="text"></br>
      ハンドル名:<input name="handlename" type="text"><input type="submit" value="送信">
</form>
<br>
移動したページでパラメータを確認して下さい。
</div>
</body>
</html>

実質的な変更は、method=”post” の部分です。getからpostに変更しました。以下のように表示されます。

送信をクリックするとGETの時と同様に結果が表示されます。但し、URLの後ろにパラメータは付加されていません。

POSTの場合は、パラメータはURLではなくリクエストボディに記述されます。ここではとにかくパラメータはGETではURLの後ろで、POSTではリクエストの本体で送信されるというぐらいでいいと思います。

GETメソッドとPOSTメソッドの使い分け
それでは、GETとPOSTをどう使い分けるかですが、まずは以下ぐらいでいいかと思います。同じ処理をGETでもPOSTでも出来る場合もたくさんあります。

GETメソッド:
何か情報を検索したり取得する場合に使う。パラメータには検索条件等が指定される。

POSTメソッド:
主に登録処理や更新処理を行う場合に使う。パラメータには登録内容や更新内容が含まれる。

CGIプログラムで検索処理や登録処理を作成する
上記で書いたGETでの検索処理やPOSTでの登録処理はどのようにCGIプログラムで書くのかということですが、まさにそれがやっと本題ということになります。

パラメータの取得(入力)からCGIでの検索処理、登録処理が実行され検索結果を表示させたり、登録内容が保存される(出力)という結果が出ます。

こういった入力から出力の流れをCGIプログラムに限らずですが、実際に書いて実行させるのがプログラム学習の重要な課題の一つだと思っています。

それを次回から書いてみたいと思います。次回はPOSTで取得した項目をテキストファイルへ保存します。