🌟
[Python CGI] (1) とりあえず動かしてみる
やること
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