サーバを準備する
ローカルで実行するための準備
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』を選んで実行し、以下のように設定しました。
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を取り込まない(同じフォルダに置かない)でアプレットを作ると、実行時にエラーは出ませんでした。)
PythonCGISlaveをMacHTTPと同じフォルダに置きます。
次にMacHTTP.configをテキストエディタで開いて、以下の2行を追記します。
ACTION PYTHON :PythonCGISlave SUFFIX PYTHON .py APPL * text/html
追記する場所はどこでもいいようです。保存しておきます。
MacHTTPと同じように、PythonCGISlaveをMacHTTPと同じフォルダに置きます。
Quid Pro Quoを立ち上げて、『Control』メニューの『Server Settings...』を選びます。
その中の『Actions』をクリックします。現れたウィンドウ内の『New Action』ボタンを押します。
『Name』欄に『PYTHON』、『Path』欄に『:PythonCGISlave』を書き込んで『OK』ボタンを押します。『:PythonCGISlave』の最初の『:』を忘れずに。。。
もう一度『Control』メニューの『Server Settings...』を選びます。
その中の『Suffix Mappings』をクリックします。現れたウィンドウ内の『New Mapping』ボタンを押します。
『Suffix』欄に『.py』、『MIME Type』欄に『text/html』と記入し、『Action』は『PYTHON』を選んで『OK』ボタンを押します。
また、ここではCGIをQuid Pro Quoと同じフォルダに置いて実行するように書いていますので、『Control』メニューの『Sever Settings...』の『Security』で『Restrict CGI Execution to cgi-bin directory』にチェックが入っていないことを確認します。
これで準備はできたので、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』は時刻を表示するようにしてるので、ブラウザの再読み込みでちゃんと読み込まれているか、CGIが働いているかわかるので便利です(と思います)。
hello.pyに誤りがあると、PythonCGISlaveアプレットが停止します。また、エラーのTracebackがPythonCGISlaveと同じフォルダにできるPythonCGISlave.errorsファイルに書き込まれるので、デバッグに便利です。
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.errorsファイルに書き込まれます。
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』を読み込むと下のようになります。
また、
if debug:
のブロックを実行して、Pythonのstdoutに以下のように表示されます。
田中求之さんが作成された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 のページへ