まずmod_pythonの第一歩

 はじめに:このページの内容はバージョン3.1.2bでの記述です。 2.7や以前のバージョンでは明らかに異なる部分があるのでそのまま使えません。
 Apache文書ツリー(DocumentRoot以下)の中に、mod_python専用のディレクトリを作ります。 ここでは /usr/local/apache/htdocs/modpythonとします。 そのディレクトリに、次のような .htaccess を作って置きます。

AddHandler mod_python .py
PythonHandler hello
PythonDebug On

PythonHandlerはこれから作ろうとするPythonスクリプトの名前によります。 例えば、これから「hello.py」を作りたいなら PythonHandler hello とします。
で、そのhello.pyはこのようにします。

from mod_python import apache

def handler(req):
  req.content_type = "text/plain"
  req.send_http_header()
  req.write("Hello, World")
  return apache.OK

# end.

このスクリプトへのURL(この例では例えば、 http://www.nsnhnkmmkk.co.jp/modpython/hello.py ) にWebブラウザでアクセスしてみます。 「Hello, World」という文字が表示されれば大成功です。


パブリッシャーハンドラを使う

 CGIでは一般に、ユーザーの入力インターフェースとしてフォームを使います。 フォームで入力した内容はCGIスクリプトに渡されるので、 CGIスクリプトでは、まず、それらの入力内容を解析して各データの値を取得する必要がありました。 mod_pythonでは、この辺りを細かく書かなくても、 より直感的に本来やりたい処理だけを書ける、 パブリッシャーハンドラという仕組みがあります。
 これを使うには、まず.htaccessに次のように書いておきます。

AddHandler mod_python .py
PythonHandler mod_python.publisher
PythonDebug On

次にCGIでお馴染みの入力フォームのHTML文書です。

<html>
<body bgcolor="white">
<form action="form1/answer" method="post">
名前:<input type="text" name="username">
<br>
<br>
<input type="submit" value="OK"><br>
</form>
</body>
</html>

その入力内容を受け取って、 表示するだけの簡単なmod_pythonスクリプトは次のようになります。

def answer(req, username):
  s = """ <html>
<body bgcolor="white">
こんにちは、%sさん。
</body></html>
""" % (username)
  return s

入力フォームのACTION=のパス「form1.py/answer」 が、スクリプト form1.py の関数 answer 、というように対応しています。 この関数answerの引数ですが、 「req」はWebブラウザからのリクエスト情報(環境周りの情報など) を持つ特殊なオブジェクトです(*1)。 それ以降(ここではusernameだけですが)は、入力フォームのCGI変数名と同じ名前の変数を並べます。 これらを引数として受け取って処理を行うわけです。 結果は、この関数の戻り値としてHTML文書形式の文字列を返すことでWebブラウザに送信できます。
(*1) reqは、その情報を使用しない場合は省略できますが、大抵は必要になりましょう。


CGI変数を取得する

 CGIでよく使われる、HTTP_USER_AGENTやREMOTE_ADDRなどのCGI環境変数を mod_pythonスクリプトで参照するには、Python組み込み変数「os.environ」 を使ってもうまくいきません。次のようにするとOKです。

from mod_python import apache

def handler(req):
  req.content_type = "text/html"
  req.send_http_header()
  req.add_common_vars()

  html = """
<html><head><title>ABC</title></head><body bgcolor="white">
こんにちは。<br>
あなたのホスト名=%s<br>
あなたのIPアドレス=%s<br>
お使いのWebブラウザ=%s<br>
このスクリプトの名前=%s<br>
""" % \
 (req.get_remote_host(apache.REMOTE_HOST),
  req.get_remote_host(apache.REMOTE_NAME),
  req.subprocess_env["HTTP_USER_AGENT"],
  req.subprocess_env["SCRIPT_FILENAME"] )
  req.write(html)
  req.write("<br>CGI環境変数一覧<br>")
  for e in req.subprocess_env.keys():
    req.write("[" + e + "] = " + req.subprocess_env[e] + "<br>")

  return "</body></html>"
# end.

 CGI環境変数のうち幾つかは、mod_pythonスクリプトの起動と同時に、 mod_python処理系組み込みの幾つかの変数に分散して格納されます。 例えば上の例では、Webブラウザユーザのホスト名がreq.get_remote_host() 関数で取得できます。詳しくはソース配布に付属のマニュアルをご覧ください。

 その他一般のCGI環境変数を取得するには、 まずreq.add_common_vars 関数を使って、CGI変数のセットを行います。 すると、サンプルにもあるように req.subprocess_env というディクショナリ変数に格納されます。

ちょっとメモ【1】mod_pythonスクリプトのPYTHONPATHを編集するには
.htaccessに次のように書けばOKです。

PythonPath "sys.path+['/home/wataci/python/modules']"

セクションのサブメニューに戻る
(first uploaded 2000/05/31 last updated 2004/01/10)