Pythonで作るもっとも簡単なフォームの受け渡し

2016年6月15日

Pythonを触り始めるとアプリケーションが作りたくなりますよね。何を作ろうかなぁ、と思った時やはり簡単なのはフォームを受け取り、それを処理するスクリプトです。基本ですが、たったこれだけでかなり色々なWEBアプリケーションが作れるようになります。今回はレンタルサーバーでCGIとして動くスクリプトを説明していきます。

ディレクトリ構造

今後PythonでWEBアプリケーションを色々作りたい、という場合はテンプレートを自作しておくと良いでしょう。Macであればターミナルから移動しやすいところにプロジェクトフォルダを作っておくとローカル環境でテストする際に迷いなく出来るはずです。

スクリーンショット 2016-06-15 15.54.38

上記のような構造にしておくと楽です。ローカルでCGIサーバーを起動させるスクリプトを入れておけばOK。

CGIを動かすスクリプト

#!/usr/bin/python2.7
# -*- coding: utf-8 -*-
import CGIHTTPServer

CGIHTTPServer.CGIHTTPRequestHandler.cgi_directories = ['/htbin', '/cgi-bin/dir1']
CGIHTTPServer.test()

cgiserver.pyの中身はたったこれだけ。

ディレクトリ名が 「test」の場合は、

$cd test
$python cgiserver.py

ターミナルから上記を打ち込むだけです。非常に楽ですね。あとはlocalhostにアクセスするだけでスクリプトの動作を確認できます。スクリプト本体は開発時は.pyで、サーバーに上げた段階で.cgiに変更しましょう。ローカルでは chmod 755 を与えておくことを忘れずに。

フォームの説明

<form method="POST" action="cgi-bin/index.py">
<p><input type="radio" value="part_a" name="choise_pattern">パターンA</p>
<p><input type="radio" value="part_b" name="choise_pattern">パターンB</p>
<p><input type="radio" value="part_c" name="choise_pattern">パターンC</p>
</form>

例えばこのようなフォームがあるとしましょう(submitボタンは省略しました)。

name="choise_pattern"

同一のnameなので、3つのうちどれかしか選択できないフォーム radioボタンのフォームとなります。valueにはPythonで受け取るvalueを設定しますが、ここでは英数字を使用します。Python2.x系は日本語の扱いにクセがあるので・・・。とはいえレンタルサーバーではPython3系使えるところも少ないので、なるべく変なちょぼミスをしないようにという意味合いです。

続いてPython側はこうなります。

import cgi

form = cgi.FieldStorage()
choose_pattern = form["choise_pattern"].value

print "Content-Type: text/html\n"

print """
<!DOCTYPE html>
<html lang="ja">
<head></head>
<body>
"""

if choose_pattern == "part_a":
    print "<p>", u"パターンAが選択されました", "</p>

elif choose_pattern == "part_b":
    print "<p>", u"パターンBが選択されました", "</p>

elif choose_pattern == "part_c":
    print "<p>", u"パターンCが選択されました", "</p>

print """
</body>
</html>
form = cgi.FieldStorage()

この箇所でフォームから送られたvalueをとるんだぞー、という記述です。専門用語を使うとわけが分からなくなると思うので、フォームを使うときに必ず書く一行と思っておけばいいでしょう。

choose_pattern = form["choise_pattern"].value

何となく分かるでしょうか? HTMLで書かれたフォームの name=’choise_pattern’ のvalueを choose_pattern という変数に入れ込みます。

あとは実際に変数に入っているvalueの値がどのパターンの場合どうしろ、という記述が続いています。

応用

この例の場合はただ単に受け取ったパターンごとにテキストを表示するだけですが、画像を用意しておいて画像を表示したり、テキストを用意しておいて書き出したり色々なことができます。フォームから受け取る情報はテキストで受け取らないので、それなりに安全とも言えるでしょう。

今回のスクリプトの応用で作ったものがこちら。

http://app.jiriki.co.jp/lp-creater/

選択されたデザインを反映させてLPサイトを書き出すツールです。一部ややこしいことも中ではやっているのですが、Pythonのフォームが書ければ直ぐに作れます。実際このツールも1日で完成してますしね。

まずはともかく、動くものを書いていこう。という精神が大事です。

主な著書

Django

Flask

Bottle