PythonでCGIプログラムを書いてローカルのサーバーもどきで動かしてみた

PythonでCGI書こうと思った動機

Pythonのプログラムをサーバーで動かすなんて考えてなかったわけで、ローカルで使うスクリプトなんかをメインに書いてきた。

Pythonのプログラムをサーバーで動かそうなんて考えたのは、アフィリエイトのプログラムをちゃちゃっと書いちゃって、月に10万くらい稼げたらなぁといういかがわしい発想から。

レンタルサーバー借りてみた

lolipopのレンタルサーバーを借りて見た。月100円ちょっととかのやつ。詳しい値段は忘れた・・・。

とは言いつつも、ローカルで動作確認したい。

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してみよう。

f:id:bukidarts:20200226001149p:plain

こんな感じでエラーを出力してくれる。

これって便利~

使い方は簡単。スクリプトに以下を埋め込むだけ。

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プログラムを書いてローカルのサーバーもどきで動かしてみた | まとめ

PythonでCGI書くのはそんなに難しくない。

PythonでCGIの書き方を学ぶおすすめ書籍

和書ではまともな書籍が見付かりませんが、洋書だと非常に詳しい書籍が出版されております。

例の、、、Programming Pythonです(1000ページ以上ある分厚い書籍)

ペーパーバックだと7000円以上しますが、Kindleだとかなりリーズナブルなので、購入して損はないです。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です