pyramidでテンプレートを使う(light weight)

1ファイルのアプリケーションでテンプレートを使う方法を説明します。

1. (デフォルトでインストールされる)makoを使う方法
2. jinja2を使う方法

の2つの方法を説明します。

はじめはテンプレートを使わないhello anyoneと表示されるだけのアプリからスタートします。

download: https://gist.github.com/gists/1610865/download

まだ、このアプリはテンプレートを利用していません。
テンプレートを利用するには、利用するテンプレートの設定を行う必要があります。

mako

mako: http://www.makotemplates.org/
(あとで説明を書く)

今回のコード(hellomako.py)は、カレントディレクトリにテンプレートを置く設定です。実際の作業時には各自適切な位置を設定するべきです。

hello_contextの辞書の内容がテンプレート中のrequest.contextに引き継がれます。

テンプレートを使わない叛との違いはこれだけです。

$ diff -u helloapp.py hellomako.py
--- helloapp.py 2012-01-14 17:55:23.544759069 +0900
+++ hellomako.py        2012-01-14 19:07:06.984759067 +0900
@@ -3,19 +3,26 @@
 from pyramid.config import Configurator
 from wsgiref.simple_server import make_server
 from pyramid.view import view_config
-from pyramid.response import Response
 
-@view_config(route_name="hello")
+def hello_context(request):
+    return {"name": "foo"}
+
+@view_config(route_name="hello", renderer="hello.mak")
 def hello_view(request):
-    return Response("hello anyone.")
+    return {}
 
 if __name__ == '__main__':
     # configuration settings
-    settings = {}
+    settings = {"mako.directories": "."} #ここtemplateを格納するディレクトリを指定する
     # configuration setup
-    config = Configurator(settings=settings)
-    config.add_route("hello", "/") # hello viewを"/"に割り当てる
-    config.scan() #これで設定が有効になる。
+    config = Configurator(settings=settings, root_factory=hello_context)
+    config.add_route("hello", "/") 
+    config.scan()
+
+    print "==="
+    print config.get_settings()["mako.directories"]
+    print "==="
+
     # serve app
     app = config.make_wsgi

jinja2

jinja2: http://jinja.pocoo.org/

(あとで説明を書く)

pyramid.jinja2(http://readthedocs.org/docs/pyramid_jinja2/en/latest/)を使います。

setup

$ pip install pyramid_jinja2
pyramidの拡張を追加する方法

config.includeを使います。


$ diff -u hellomako.py hellojinja2.py

makoを使う叛との違いはこれだけです。

--- hellomako.py	2012-01-14 19:07:06.984759067 +0900
+++ hellojinja2.py	2012-01-14 19:15:06.354759065 +0900
@@ -7,20 +7,21 @@
 def hello_context(request):
     return {"name": "foo"}
 
-@view_config(route_name="hello", renderer="hello.mak")
+@view_config(route_name="hello", renderer="hello.jinja2")
 def hello_view(request):
     return {}
 
 if __name__ == '__main__':
     # configuration settings
-    settings = {"mako.directories": "."} #ここtemplateを格納するディレクトリを指定する
+    settings = {"jinja2.directories": "."} #ここtemplateを格納するディレクトリを指定する
     # configuration setup
     config = Configurator(settings=settings, root_factory=hello_context)
+    config.include("pyramid_jinja2")
     config.add_route("hello", "/") 
     config.scan()
 
     print "==="
-    print config.get_settings()["mako.directories"]
+    print config.get_settings()["jinja2.directories"]
     print "==="
 
     # serve app

設定ファイルに書く方法

モジュールを分けて開発している場合には、以下のように書きます。
書く場所は、development.iniやproduction.iniなどです。

jinja2.directories = "%(here)s/templates" #hereはプロジェクトディレクトリのパスが自動的に設定される。

この設定の場合ですが、仮にhelloプロジェクト*1の場合には

hello/templates/hello.jinja2

などを見に行くような設定となります。

これはmakoを使う際も同様です。

todo

  • resourceについての説明
    • resourceオブジェクトが普通

*1:pcreate helloでscaffoldした環境