2012-12-08 [長年日記]

tracのHelloWorldプラグインを作ってみる

前回に引き続き。

つまり、自分でプラグインを実装するときも、IRequestHandler インタフェースを実装したクラスで、match_requestメソッド で自分が処理できるリクエストかどうか判定し、process_requestメソッドでリクエストを処理してやればいい、ということ。
やってみる。まずはセオリーどおり、/helloworld というURLに反応して Hello, World! を返すプラグインをつくる。
  1. Ctrl-N で PyDEV Source Folder を HelloWorldPlugin とい名前で作り、
  2. Ctrl-N で PyDEV Module を パッケージ myplugs、モジュール名 helloworld で作り、
  3. helloworld.py をこんな感じに実装してやる:
    class HelloWorldPlugin(Component):
        implements(IRequestHandler)
        
        # IRequestHandler methods
        def match_request(self, req):
            return req.path_info == '/helloworld'
        
        def process_request(self, req):
            content = 'Hello World!'
            req.send_response(200)
            req.send_header('Content-Type', 'text/plain')
            req.send_header('Content-Length', len(content))
            req.end_headers()
            req.write(content)

赤線がついた Component, implements, IRequestHandler はコンパイルエラーになってるところなので、それぞれ Qiuck Fix (ctrl-1) で適切に import文を追加してやればOK。

そうそう。HTTPレスポンスの書き方は知ってると思うけど念のため。リクエストに対して、以下のようなテキストを返してやれば、Webブラウザが解釈して表示してくれる:

200 OK
Content-Type: text/plain
Content-Length: 0
    
Hello, World!

ビルドスクリプトを作り、ビルドする

Ctrl-N で PyDEV Module を、無名パッケージ、モジュール名 setup で用意して、こんな感じに書く:

from setuptools import find_packages, setup
    
setup(
    name='TracHelloWorld', version='1.0',
    packages=find_packages(exclude=['*.tests*']),
    entry_points = {
        'trac.plugins': [
            'helloworld = myplugs.helloworld',
        ],
    },
)

作った setup.py を 引数 egg_info をつけて実行する。ええと、trac起動スクリプトを実行した時と同じように、まず setup.py を選択して Run - Run as で一回実行して(エラーになる)、Run - Run Configurations... から、Arguments に、egg_info を追加して run しておく。 setup.py と同じフォルダに、TracHelloWorld.egg-info フォルダができればOK。

Tracプロセスを再起動して、プラグインの動作を確認する

いま Console View は setup.py の実行結果が出ているので、tracdのコンソールに切り替えて、再起動ボタンを押してリスタートしてやる。すると、tracの 管理 - プラグイン設定 で myplugs.helloworld が出てくるので、Enable - Apply Changed して有効にしてやる。

ブラウザから、http://localhost:8080/1.0/helloworld へアクセスすると、しれっと「Hello World」と表示される。

あとは、ソースを編集 - Tracdを再起動 - 動作確認 を繰り返してやればいい。再起動が面倒だったら、tracd に --auto-reload をつけると手間を省ける。


«前の日記(2012-12-07) 最新 次の日記(2012-12-09)»