人は歴史を創り出し、人は歴史を語り継ぐ このページをアンテナに追加 RSSフィード

2009-12-06 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/アクセスすると管理者の名前とパスワードの入力を要求されるので名前とパスワードを入力します。

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

f:id:ytakeuch:20091206223104p:image

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

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

f:id:ytakeuch:20091206223238p:image

と表示されます。

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

f:id:ytakeuch:20091206223945p:image

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/リダイレクトするように設定します。

<VirtualHost *:80>

ServerName grok.example.com

RewriteEngine On

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

</VirtualHost>



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

トラックバック - http://d.hatena.ne.jp/ytakeuch/20091206