GrokでかんたんWebアプリ

BGM : light prayer by school food punishment

Ciel Sereinの安田さんからZope/Ploneアドベントカレンダーのバトンが回ってきました。
GrokZope3をベースとしたWebアプリフレームワークです。非常に簡単にWebアプリを作ることが出来ます。最初の雛形になるアプリを動作させるまではエディタでファイルを編集する必要はありません。
OSをインストールした初期状態からアプリを動作させてApacheと組み合わせて動作させるまでを説明します。

1.下準備
Pythonbashが入っていない場合はインストールします。Pythonのバージョンは2.5です。
シェルはbashを使います。

Easy Installのインストール

$ wget http://peak.telecommunity.com/dist/ez_setup.py
$ sudo python2.5 ez_setup.py

VirtualEnvのインストールとセットアップ

$ sudo easy_install-2.5 virtualenv
$ virtualenv --no-site-packages virtualgrok
$ cd virtualgrok
$ source bin/activate

これで仮想環境にGrokをインストールする準備が出来ました。

2.Grokのインストールと雛形のセットアップ

$ easy_install grokproject
$ grokproject Sample

Enter user (Name of an initial administrator user): [管理者の名前]
Enter passwd (Password for the initial administrator user): [管理者のパスワード]


ちょっと時間がかかりますが辛抱してください。

雛形のアプリを実行します。

$ cd Sample
$ bin/paster serve parts/etc/deploy.ini

localhostのポート8080番にアクセスします。

Grokを動かしているのがリモートホストの場合はsshでトンネルを掘ります。

$ ssh -N -L 8080:localhost:8080 user@foo.bar.com

http://localhost:8080/ にアクセスすると管理者の名前とパスワードの入力を要求されるので名前とパスワードを入力します。

そうすると次のような画面が表示されます。

Add applicationの欄のsample.app.SampleのName your new appにアプリケーション名testを入力してCreateボタンを押します。

http://localhost:8080/test にアクセスすると


と表示されます。
3.Webアプリを作る

入力された数字までのフィボナッチ数を列挙する単純なアプリを作ります。

src/sample/app.py を次のように書き換えます。

import grok

class Sample(grok.Application, grok.Container):
pass

class Index(grok.View):
def getResults(self):
def fib(n):
if n < 2:
return n
else:
return fib(n-2) + fib(n-1)

max = int(self.getMax())
result = []
for n in range(max+1):
entry = {}
entry['n'] = n
entry['fib(n)'] = fib(n)
result.append(entry)
return result

def getMax(self):
return self.request.get('max') or '1'

Zope Page Template src/sample/app_templates/index.pt を次のように書き換えます。

<html>
<head>
</head>
<body>
<form action="" tal:attributes="action view/url">
<input type = "text" name="max" value ="" size="10" tal:attributes="value view/getMax">
<input type="submit">
</form>
<table border="1">
<tr>
<td align="right">n</td>
<td align="right">fib(n)</td>
</tr>
<div tal:repeat="entry view/getResults">
<tr>
<td align="right"><p tal:content="entry/n"></p></td>
<td align="right"><p tal:content="entry/fib(n)"></p></td>
</tr>
</div>
</table>
</body>
</html>

アプリを再実行します。

^C
$ bin/paster serve parts/etc/deploy.ini

4.Apacheとの連携
外部からアクセスできるようにするには parts/etc/deploy.iniを書き換えることでも可能になりますが、Apacheをフロントエンドにする方法を説明します。
Zope3のVirtual Hosting機能(http://wiki.zope.org/zope3/virtualhosting.html)を使います。

http://grok.example.com/ にアクセスされると http://localhost:8080/test/ にリダイレクトするように設定します。


ServerName grok.example.com
RewriteEngine On
RewriteRule ^(.*) http://localhost:8080/test/++vh++http:grok.example.com:80/++$1 [P,L]

次のバトンはaodagさんにお渡しします。