読者です 読者をやめる 読者になる 読者になる

oneshotlife-pythonのブログ

Pythonを好んで使っているプログラマです。Pythonこそが最強のプログラミング言語だと思っています。Pythonは使いやすいです。Pythonは書きやすいです。Pythonは読みやすいです。Pythonはパワフルです。Pythonは一貫性があります。Pythonが好きです。

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

CGI

もともとは、

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

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

lolipopのレンタルサーバーを借りて見た。月100円ちょっととかのやつ。詳しい値段は忘れた・・・。
ロリポップ!レンタルサーバー | 初期費用半額キャンペーン中

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

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:oneshotlife_tom:20140314153110j: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/html\n\n"
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']

まとめ

PythonCGI書くのはそんなに難しくない。

Python クックブック 第2版

Python クックブック 第2版