🌊
[Python CGI] (2) フォームの値を受け取って表示する
やること
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 -
Discussion