tipfy - Hello, World! チュートリアル
まずはチュートリアルということで、おなじみ Hello, World! に挑戦。Hello, World! Tutorial を見ながらやってみます。
ひな形プロジェクト展開
いきなり Hello, World! Tutorial をやろうとしたのですが、まずはフレームワークをインストールしなくてはなりません。tipfy の場合はパッケージをダウンロードすると、中にアプリケーションのひな形となるディレクトリがあるので、このディレクトリ内のファイルを自分のアプリにコピーして使います。
ということで、まずは以下のページから tipfy の配布ファイルをダウンロードします。
Downloads - tipfy - Project Hosting on Google Code
ダウンロードしたファイルを展開すると、
$ ls -F tipfy AUTHORS.txt README.txt manage/ source/ LICENSE.txt docs/ setup.py tests/
この source ディレクトリの中に、tipfy アプリのひな形がこんな感じで入ってます。
$ ls -F tipfy/source app.yaml lib/ static/ tipfy/ config.py main.py templates/ urls.py
おなじみの app.yaml があります。ファイル名やディレクトリ名でだいたい中身の検討がついちゃいますね。
まずは、まっさらなところから Hello, World! アプリを作りたいと思うので source ディレクトリを丸ごとコピーして準備します。
$ cp -pr tipfy/source helloworld
これで helloworld ディレクトリにアプリのひな形が用意できました。
$ cd helloworld
Hello, World! チュートリアル
まずは、リクエストハンドラを作ります。
hello.py ファイルを新しく作成
1 from tipfy import RequestHandler, response
2
3 class HelloWorldHandler(RequestHandler):
4 def get(self, **kwargs):
5 response.data = 'Hello, World!'
6 return response
見ての通りなんですが、クラスの get メソッドが HTTP GET を処理して post メソッドがあれば HTTP POST を処理するということだそうです。それぞれ tipfy.response を返すようにします。
RequestHandler とか request, response については後ほどゆっくり見てみることにしましょう。
次に、URL のパスと上記リクエストハンドラを結びつけるための Rule を書きます。
urls.py 既存ファイルに Rule を追加
1 # -*- coding: utf-8 -*-
2 """
3 urls
4 ~~~~
5
6 URL definitions.
7
8 :copyright: 2009 by tipfy.org.
9 :license: BSD, see LICENSE.txt for more details.
10 """
11 from tipfy import get_config, import_string, Rule
12
13 def get_rules():
14 rules = [
15 ### ↓↓↓ 追加します ↓↓↓
16 Rule('/', endpoint='home', handler='hello:HelloWorldHandler'),
17 ]
18
19 for app_module in get_config('tipfy', 'apps_installed'):
20 try:
21 # Load the urls module from the app and extend our rules.
22 app_urls = import_string('%s.urls' % app_module)
23 rules.extend(app_urls.get_rules())
24 except ImportError:
25 pass
26
27 return rules
まずはここまで。Rule の引数についても後ほど詳しく見ることにしときます。
とりあえずはこの状態でアプリを実行してブラウザでアクセスすると「Hello, World!」が表示されます。
$ dev_appserver.py .
Hello, World チュートリアルをテンプレート対応
上記チュートリアルではレスポンスを RequestHandler に直接書いていたので、これをテンプレートで出力するようにしてみます。
tipfy は標準で Jinja2 と Mako というテンプレートに対応しています。ここでは Jinja2 を使ってみます。
templates/hello.html ファイルを新しく作成
{{message}}これが Jinja2 のテンプレートになります。
hello.py を修正します
1 from tipfy import RequestHandler
2 from tipfy.ext.jinja2 import render_response
3
4 class HelloWorldHandler(RequestHandler):
5 def get(self, **kwargs):
6 context = {'message': 'Hello, World!'}
7 return render_response('hello.html', **context)
見ての通りで render_response が Jinja2 テンプレートをレンダリングして返すというわけです。
テンプレートに Mako を使いたい場合は tipfy.ext.jinja2 のところを tipfy.ext.mako にすればいいそうです。
Hello, World! チュートリアルを JSON 対応
レスポンスを JSON にしたい場合は、
hello.py を修正します
1 from tipfy import RequestHandler, render_json_response
2
3 class HelloWorldHandler(RequestHandler):
4 def get(self, **kwargs):
5 context = {'message': 'Hello, World!'}
6 return render_json_response(context)
すると application/json レスポンスを返します。
Hello, World! チュートリアルを AJAX 対応
みたいなことが元のチュートリアルに書いてあるんですが、どういうことかと言うと、ひとつの RequestHandler で、AJAX リクエストには JSON でレスポンスして、普通のリクエストにはテンプレートをレンダリングして返すことが簡単にできるということで、
hello.py を修正します
1 from tipfy import RequestHandler, request, render_json_response
2 from tipfy.ext.jinja2 import render_response
3
4 class HelloWorldHandler(RequestHandler):
5 def get(self, **kwargs):
6 context = {'message': 'Hello, World!'}
7 if request.is_xhr:
8 return render_json_response(context)
9 else:
10 return render_response('hello.html', **context)
ということで request.is_xhr で判断してレスポンスを変えたり出来ると言うことですね。
tipfy - small Python framework for App Engine