MacPythonについてのページ(よ)>

Mac(Classic)PythonでCGIを実行する


目次

サーバを準備する
ローカルで実行するための準備
PythonCGISlaveを使う
    MacHTTPの場合Quid Pro Quoの場合
hello.pyを実行してみる
BuildCGIAppletを使う
CGIAppletを作る
その他

まえがき

Mac(Classic)PythonでMacサーバ用にCGIを作る方法、というか、動かすのを私がやった手順を書いていきます。

私は自前のサーバを立てていないので、ローカルでのやり方を書きます。

私のマシン Performa5430/MacOS8.1/Python2.0 でやっていきますので(Color Classic II/MacOS7.5.5/Python1.5.2/MacHTTP2.6でもやってみました)、Windows の方、MacOSXの方、ごめんさない。MacOS Classicという、もう時代遅れの感があるものでのことですので。。。ごめんなさい。

私は素人なので、Webサーバシステムやセキュリティとかをよく知りませんので、あまり信用しないで下さい。

それでも誤りやご質問などございましたら、メールで、もしくはMacPython BBS(よ)へ書き込んでいただければ幸いです。

サーバを準備する

AppleShareも使えると思うのですが、機能拡張が必要だったりして少し面倒なので、フリーウェアであるMacHTTP 2.6とQuid Pro Quo 2.1.2 を使ってみました。

MacOS ClassicのサーバのCGIはAppleEventを使ってやり取りするそうです。それでUnixなどのようにPythonのスクリプトをそのまま実行してくれるわけではないようです。このへんのことはWeb Scripter's Meetingのページの資料室に参考になる文書があります。私もこのページで勉強させていただきました。

ローカルで実行するための準備

私は自前のサーバを立てていないので、ローカルで実行できるように設定します。

コントロールバーの『AppleTalkスイッチ』で『AppleTalk 使用』を選びます。
次にコントロールパネルから『TCP/IP』を選んで実行し、以下のように設定しました。

TCP/IPの設定

PythonCGISlaveを使う

PythonのスクリプトをCGIとして実行するのに簡単なのがPythonCGISlaveを使う方法です。
PythonCGISlaveはPython2.0の『Mac:Tools:CGI』フォルダにあります。

(Python1.5.2にはPythonCGISlaveがありませんが、Python2.0のPythonCGISlave.py、BuildCGIApplet.pyをPython1.5.2のBuildAppletでアプレットにビルドすることによって、以下の操作がPython1.5.2でも実行できます。私はColor Classic II/MacOS7.5.5/MacHTTP2.6でもやってみました。このとき、PythonCGISlave.rsrc、BuildCGIApplet.rsrcをそれぞれの「〜.py」と同じフォルダに置いてビルド時に取り込んで作ったアプレットを実行すると「Your Preference is corrupt or updated ...」のダイアログが出ます。ignoreボタンを押せばそのまま実行できます。でも、PythonCGISlave.rsrc、BuildCGIApplet.rsrcを取り込まない(同じフォルダに置かない)でアプレットを作ると、実行時にエラーは出ませんでした。)

MacHTTPの場合

PythonCGISlaveをMacHTTPと同じフォルダに置きます。

PythonCGISlaveをフォルダに

次にMacHTTP.configをテキストエディタで開いて、以下の2行を追記します。

ACTION PYTHON :PythonCGISlave
SUFFIX PYTHON .py APPL * text/html

追記する場所はどこでもいいようです。保存しておきます。

Quid Pro Quoの場合

MacHTTPと同じように、PythonCGISlaveをMacHTTPと同じフォルダに置きます。

PythonCGISlaveをフォルダに

Quid Pro Quoを立ち上げて、『Control』メニューの『Server Settings...』を選びます。
その中の『Actions』をクリックします。現れたウィンドウ内の『New Action』ボタンを押します。
『Name』欄に『PYTHON』、『Path』欄に『:PythonCGISlave』を書き込んで『OK』ボタンを押します。『:PythonCGISlave』の最初の『:』を忘れずに。。。

Quid Pro Quoの設定1

もう一度『Control』メニューの『Server Settings...』を選びます。
その中の『Suffix Mappings』をクリックします。現れたウィンドウ内の『New Mapping』ボタンを押します。
『Suffix』欄に『.py』、『MIME Type』欄に『text/html』と記入し、『Action』は『PYTHON』を選んで『OK』ボタンを押します。

Quid Pro Quoの設定2

また、ここではCGIをQuid Pro Quoと同じフォルダに置いて実行するように書いていますので、『Control』メニューの『Sever Settings...』の『Security』で『Restrict CGI Execution to cgi-bin directory』にチェックが入っていないことを確認します。

hello.pyを実行してみる

これで準備はできたので、Pythonで簡単なCGIスクリプトを作って実行してみます。以下のhello.pyをMacHTTPあるいはQuid Pro Quoと同じフォルダに置きます

 
hello.py
--------------------------------------------------
import time

print "HTTP/1.0 200 OK"
print "Server: Unknown"
print "MIME-Version: 1.0"
print "Content-Type: text/html"
print
print "<HTML><HEAD><TITLE>CGI TEST</TITLE>"
print "</HEAD>\n<BODY>"
print "Hello world!<BR>"
print "Local time is %s\n" % time.ctime(time.time())
print "</BODY></HTML>"
--------------------------------------------------

MacHTTPあるいはQuid Pro Quoを起動します。また、PythonCGISlaveもダブルクリックして起動します。
ブラウザを開いて、URL欄に『http://110.110.110.110/hello.py』を入力するとPythonCGISlaveが『hello.py』の内容を実行して以下のように表示されます。110.110.110.110はTCP/IPの設定でIPアドレスに設定したものです。

hello.pyの実行

『hello.py』は時刻を表示するようにしてるので、ブラウザの再読み込みでちゃんと読み込まれているか、CGIが働いているかわかるので便利です(と思います)。

hello.pyに誤りがあると、PythonCGISlaveアプレットが停止します。また、エラーのTracebackがPythonCGISlaveと同じフォルダにできるPythonCGISlave.errorsファイルに書き込まれるので、デバッグに便利です。

BuildCGIAppletを使う

MacHTTPの2.4くらいのバージョンではActionに対応していなかったので、PythonCGISlaveが使えませんでした。そのような場合はBuildCGIAppletでpythonのCGIスクリプトをアプレットにすることで実行できます。

BuildCGIAppletは『Python 2.0:Mac:Tools:CGI』フォルダにあります。 なお、Python 2.0のBuildCGIAppletには、ソースであるBuildCGIApplet.pyに誤りがあります。Python 2.1以降では訂正されています。

 
BuildCGIApplet.pyの66行目
--------------------------------------------------
(誤)
    ref = Res.FSpOpenResFile(dst, 1)
(正)
    ref = Res.FSpOpenResFile(dst, 2)
--------------------------------------------------

このように直して、BuildCGIApplet.pyをBuildAppletにドロップして、BuildCGIAppletを作ります。

先ほどのhello.pyをBuildCGIAppletにドロップします。すると、バイトコンパイルされた『hello.pyc』とCGIアプレット『hello.cgi』ができます。『hello.cgi』はMacHTTPあるいはQuid Pro Quoと同じフォルダにあることを確認して下さい。

次に『hello.cgi』をダブルクリックして起動します。
ブラウザでURL『http://110.110.110.110/hello.cgi』を呼び出すと、先ほどと同じように表示されます。

hello.cgiの実行

hello.cgiに誤りがあるとhello.cgiアプレットは停止します。エラーの内容はhello.cgiと同じフォルダにできるhello.cgi.errorsファイルに書き込まれます。

CGIAppletを作る

BuildCGIAppletやPythonCGISlaveでたいていのことはできると思いますが、複雑なスクリプトではうまく機能しないこともあるようです。
私はBBSを作っていて『print 'HTTP/1.0 302 Found' + \n\n + 'Location:' 〜』が働かなかったことがありました。これは私の勘違いかもしれませんが。。。

それで、自前のCGIスクリプトを『Python 2.0:Mac:Demo:cgi:realcgitest.cgi.py』を参考に作ってみました。

スクリプトは以下の通りです。

hellocgi.cgi.py
--------------------------------------------------
from MiniAEFrame import AEServer, MiniApplication
import MacOS

debug=1

class CGITest(AEServer, MiniApplication):
	
	def __init__(self):
		MiniApplication.__init__(self)
		AEServer.__init__(self)
		self.installaehandler('aevt', 'oapp', self.open_app)
		self.installaehandler('aevt', 'quit', self.quit)
		self.installaehandler('WWW\275', 'sdoc', self.cgihandler)
		if debug:
			self.installaehandler('****', '****', self.otherhandler)
		oldparams = MacOS.SchedParams(0, 0)
		self.mainloop()
		apply(MacOS.SchedParams, oldparams)

	def quit(self, **args):
		self.quitting = 1
		
	def open_app(self, **args):
		pass
	
	def otherhandler(self, *args, **kwargs):
		print 'Unknown AppleEvent'
		print 'args', args
		print 'kwargs', kwargs
		
	def cgihandler(self, pathargs, **args):
		if debug:
			print 'CGI request', pathargs, args
		import time
		LocalTime = "Local time is %s\n" % time.ctime(time.time())
		content = """HTTP/1.0 200 OK
Server: Unknown
MIME-Version: 1.0
Content-type: text/html

<HTML><HEAD><TITLE>CGI TEST</TITLE>
</HEAD>\n<BODY>
Hello world!<BR>
"""
		content = content + LocalTime + """</BODY></HTML>
"""
		
		return content

if __name__ == '__main__':
	CGITest()

--------------------------------------------------

これをBuildAppletに(BuildCGIAppletではありません)ドロップすると『hellocgi.cgi』ができます。これをダブルクリックして起動し、ブラウザで URL『http://110.110.110.110/hellocgi.cgi』を読み込むと下のようになります。

hellocgi.cgiの実行

また、

	if debug:

のブロックを実行して、Pythonのstdoutに以下のように表示されます。

hellocgi.cgiのstdout

その他

EasyBBS PYN について

田中求之さんが作成されたEasyBBS DX IIIをPythonに移植、というより直訳して、EasyBBS PYN を作りました( 2003/09/11 )。

これはPythonで書いたCGIで動くBBSです。MacClassic用(MacOS8.1/7.5.5+MacPython2.0/1.5.2、MacHTTP2.6)とLinux用(Vine Linux PPC 2.0/Apache1.3.12)を作りました。こちらも何かの参考になれば、と思います。

->EasyBBS PYN のページへ
<▲このページのTOPへ>

MacPythonについてのページ(よ)トップへ

by ©Hioryuki Yoshimura 2003.
Last modified at 2003/12/31