Pythonには簡易CGIサーバーがデフォルトで付属してるんだけど、今日はコレで小一時間くらいハマッた。

折角だからメモメモ。

まずは、HTMLファイルね。パラメータ受け取るための、別にどうってことないフォームを持ってる。
index.html
<html><body>
<form action="/cgi-bin/test.py" method="GET">
<input type="text" name="param" />
<input type="submit"/>
</form>
</body></html>

フォームの内容を処理するPythonスクリプト。
/cgi-bin/test.py
#!/usr/bin/env python
import cgi

form = cgi.FieldStorage()
param = form["param"].value

print "Content-type: text/html"
print "<html>"
print "<body>"
print param
print "</body>"
print "</html>"

これで、python -m CGIHTTPServerでCGIサーバーを起動する。
一見すると、正常に動きそうなんだけどこれだとリクエスト(http://localhost:8000/cgi-bin/test.py)投げても画面は真っ白なまんま。

さて、一体何が原因なのか。
正常に動く場合のスクリプトが以下。
/cgi-bin/test.py(修正版)
#!/usr/bin/env python
import cgi

form = cgi.FieldStorage()
param = form["param"].value

print "Content-type: text/html\n"
print "<html>"
print "<body>"
print param
print "</body>"
print "</html>"

まるで間違い探しだよ。








正解は、Content-typeを設定してるところの「\n」の有無。

これは、HTTPヘッダーとコンテンツの間に1行空行がないとダメなことが原因な様子。つまり、スクリプトの出力結果としては、
Content-type: text/html
<html>
…
だとダメで、
Content-type: text/html

<html>
…
だと正常に動くってことね。
空行一つで動作が変わるという、なんともナイーブだなぁーと思った。

また一つ勉強になったー。