[Python CGI] (2) フォームの値を受け取って表示する

2 min読了の目安(約2500字TECH技術記事

やること

PythonでCGIプログラミングやってみる。今回は、フォームの値を受け取って表示してみる。

環境

Raspberry Pi 3 model B+ に Raspbian をインストールした環境を使用

$ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description:    Raspbian GNU/Linux 10 (buster)
Release:        10
Codename:       buster

$ uname -a
Linux raspi102 5.4.50-v7+ #1324 SMP Wed Jul 1 17:00:22 BST 2020 armv7l GNU/Linux

$ python3 --version
Python 3.7.3

あとクライアント用にWindowも用意しました。ラズパイとWindowsはネットワーク通信できます。

フォームの値をCGIで処理するCGIを作る

フォームに入力した値をCGIで受け取って、その値を表示する仕組みを作ってみます。

testディレクトリを作成し、以下のようにディレクトリ,ファイル(test02.html, pycgi02.py)を作成します。

$ mkdir test
$ mkdir test/cgi-bin
$ touch test/test02.html
$ touch test/cgi-bin/pycgi02.py
$ sudo chmod 755 test/cgi-bin/pycgi02.py
$ cd test
$ tree
.
├── cgi-bin
│   └── pycgi02.py
└── test02.html

test02.htmlを以下のようにします。

test02.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>[test02] Python3 CGI Form Test</title>
  <head>
  <body>
    <form action="/cgi-bin/pycgi02.py" method="post">
    <input type="text" name="area01"> <BR />
    <input type="text" name="area02"> <BR />
    <input type="submit" name="submit">
  </form>
  </body>
</html>
cgi-bin/pycgi02.py
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import cgi
import sys
import io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
print("[Python CGI Test 02]",file=sys.stderr)
print('Content-Type: text/html; charset=UTF-8\n')
html_body = """
<h1>[Python3 CGI test 02]</h1>
<h2>area01 = "%s"</h2>
<h2>area02 = "%s"</h2>
"""
form = cgi.FieldStorage()
area01 = form.getvalue('area01', '')
area02 = form.getvalue('area02', '')
print(html_body % (area01, area02))

動かしてみる

Python3でWebサーバーを起動します。

$ pwd
/home/pi/data/test
$ sudo python3 -m http.server 8000 --cgi

Windowsでhttp://{{ラズパイのIPアドレス}}:8000/test02.htmlを開き、以下のように表示されます。

フォームに何かしら値を入力します。

送信ボタンをクリックし、以下のように表示されたら成功です。

サイトを開いたときのWebサーバーのログはこんな感じ

$ python3 -m http.server 8000 --cgi
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
192.168.3.7 - - [15/Nov/2020 00:57:36] "GET /test02.html HTTP/1.1" 304 -
192.168.3.7 - - [15/Nov/2020 00:57:43] "POST /cgi-bin/pycgi02.py HTTP/1.1" 200 -