目次
PythonでCGI書こうと思った動機
Pythonのプログラムをサーバーで動かすなんて考えてなかったわけで、ローカルで使うスクリプトなんかをメインに書いてきた。
Pythonのプログラムをサーバーで動かそうなんて考えたのは、アフィリエイトのプログラムをちゃちゃっと書いちゃって、月に10万くらい稼げたらなぁといういかがわしい発想から。
とは言いつつも、ローカルで動作確認したい。
CGIをサーバ上で動かすとなると、バグの内容によってはサーバ全体を停止させるような致命的なエラーを発生させてしまうことがあり得ます。
PythonにはCGIHTTPServerというCGIを動作確認できるクラスがあります。こいつを使えば、動作確認出来る!簡単に言うと、こいつがサーバーの変わりをしてくれる。
python -m CGIHTTPServer
Windowsの場合、プロンプトから以下のコマンドを打ち込んでやるだけ。ちなみに、そのときのカレントディレクトリがルートになるので注意。
P:>python -m CGIHTTPServer Serving HTTP on 0.0.0.0 port 8000 …
以下のアドレスにスクリプトを配置してアクセスする。
http://localhost:8000/cgi-bin/hello.py
ちなみに、俺は、ルートの下に、cgi-binというディレクトリを配置したけど、無ければ無いでルート直下に置いてもいいと思う。
実行すると、以下のような表示が。
Hello,World!
hello.pyのソースはこんな感じです。
#!/usr/bin/python # -*- coding: utf-8 -*- print "Content-type: text/html" print print "<html>" print "Hello,World!" print "</html>"
CGIスクリプトのデバッグ
サーバーに配置したスクリプトのデバッグは難しい・・・。なぜなら、サーバーにデバッガがついているわけじゃないから。なので、出来れば、ローカルでサーバーの疑似環境を作ってデバッグ出来るのが望ましい。
それか、頑張ってprint分を埋めてチクチクデバッグする(古典的だが)。
Pythonにはcgitbっていう便利なデバッグ用モジュールがある。例えば、未定義の変数をprintしてみよう。
こんな感じでエラーを出力してくれる。
これって便利~
使い方は簡単。スクリプトに以下を埋め込むだけ。
import cgitb
cgitb.enable()
クエリーを受け取る
以上は、単に固定文字列を出力するサンプルだけど、クエリーを受け取って、受け取った結果によって出力する内容を変えるというちょっとしたプログラムを書きたくなってくると思う。出力する内容は、個人の自由に任せるとして、クエリーを受け取る方法は簡単。
以下がサンプルソース
import os import cgi import cgitb cgitb.enable() if 'QUERY_STRING' in os.environ: query = cgi.parse_qs(os.environ['QUERY_STRING']) else: query = {} print "Content-Type: text/htmlnn" for k, v in query.items(): print k, v,"<br/>"
os.environっていうディクショナリに、QUERY_STRINGがキーの値があり、そこにクエリが入っている。
以下のように要求してみた。
http://localhost:8000/cgi-bin/getquery.py?title=spam¶m1=aaa¶m2=bbbb
クエリの全キーと値を出力したところ以下のようになる。
param2 [‘bbbb’] param1 [‘aaa’] title [‘spam’]
PythonでCGIの書き方を学ぶおすすめ書籍
和書ではまともな書籍が見付かりませんが、洋書だと非常に詳しい書籍が出版されております。
例の、、、Programming Pythonです(1000ページ以上ある分厚い書籍)
ペーパーバックだと7000円以上しますが、Kindleだとかなりリーズナブルなので、購入して損はないです。