🌟

[Python CGI] (1) とりあえず動かしてみる

2020/11/15に公開

やること

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はネットワーク通信できます。

Python3でCGIを作ってみる

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

$ mkdir test
$ mkdir test/cgi-bin
$ touch test/cgi-bin/test01.py
$ sudo chmod 755 test/cgi-bin/test01.py
$ cd test
$ pwd
/home/pi/data/test
$ tree
.
└── cgi-bin
    └── test01.py

1 directory, 1 file

test01.pyを以下のようにします。

cgi-bin/test01.py
#!/usr/bin/python3
# -*- coding: utf-8 -*-

print("[Python CGI Test 01]",file=sys.stderr)
print('Content-Type: text/html; charset=UTF-8\n\n')
print('TEST DESU')

動かしてみる

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

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

Windowsでhttp://{{ラズパイのIPアドレス}}:8000/cgi-bin/test01.pyを開き、以下のように表示されたら成功です。

サイトを開いたときの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 - - [14/Nov/2020 22:48:54] "GET /cgi-bin/test01.py HTTP/1.1" 200 -
192.168.3.7 - - [14/Nov/2020 22:49:40] "GET /cgi-bin/test01.py HTTP/1.1" 200 -

※注意事項※

先ほど紹介したtest01.pyがうまく表示できなかったときは、以下の3つを確認するといいことあるかも。

  • ①改行コードはCRLFはダメ。LFはオーケー
  • test01.pyファイルのアクセス権を変更する
  • test01.pyの1行目を見直す

①改行コードはCRLFはダメ。LFはオーケー

test01.pyファイルの改行コードがCRLFだとエラーになります。VSコードだと以下の赤枠で確認できます。

発生したエラー

$ 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 - - [14/Nov/2020 23:06:35] "GET /cgi-bin/test01.py HTTP/1.1" 200 -
----------------------------------------
Exception happened during processing of request from ('192.168.3.7', 61762)
Traceback (most recent call last):
  File "/usr/lib/python3.7/http/server.py", line 1170, in run_cgi
    os.execve(scriptfile, args, env)
FileNotFoundError: [Errno 2] No such file or directory: '/home/pi/data/test2/cgi-bin/test01.py'
----------------------------------------
192.168.3.7 - - [14/Nov/2020 23:06:35] CGI script exit status 0x7f00

このエラーは、改行コードをLFに変更することで対策できました。

test01.pyファイルのアクセス権を変更する

test01.pyのアクセス権が足りないと以下のエラーになりました。

サーバー側のエラー

$ 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 - - [14/Nov/2020 23:12:06] code 403, message CGI script is not executable ('/cgi-bin/test01.py')
192.168.3.7 - - [14/Nov/2020 23:12:06] "GET /cgi-bin/test01.py HTTP/1.1" 403 -

このエラーはアクセス権を変更すると対策できました。

$ sudo chmod 755 test01.py

test01.pyの1行目を見直す

test01.pyの1行目は、pythonのインストール先を指定しています。whichでpython3のインストール先を確認し、適切なパスを設定します。

test01.py
#!/usr/bin/python3

私の環境で、whichを実行した結果です

 $ which python3
/usr/bin/python3

たとえば、以下のように間違えたパスを設定するとエラーが発生します。

test01.py
#!/usr/bin/hogethon

発生したエラー(このエラーからtest01.pyの1行目が間違っているのわかりにくい、、)

 $ 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 - - [14/Nov/2020 23:16:42] "GET /cgi-bin/test01.py HTTP/1.1" 200 -
----------------------------------------
Exception happened during processing of request from ('192.168.3.7', 64335)
Traceback (most recent call last):
  File "/usr/lib/python3.7/http/server.py", line 1170, in run_cgi
    os.execve(scriptfile, args, env)
FileNotFoundError: [Errno 2] No such file or directory: '/home/pi/data/test2/cgi-bin/test01.py'
----------------------------------------
192.168.3.7 - - [14/Nov/2020 23:16:42] CGI script exit status 0x7f00

Discussion