主にプログラミングに関して。Python, .NET Framework(C#), JavaScript, その他いくらか。
記事にあるサンプルやコードは要検証。使用に際しては責任を負いかねます

スポンサーサイト

                
tags:
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Pythonのテンプレートについて Django,jinja2

                
tags:
Webアプリなどを作るとき、テンプレートエンジンを使っている。GAEに最初からバンドルされてたDjangoのテンプレートを、チュートリアルを読んで使っていた。だがGAEのバージョンアップにともなって、jinja2というテンプレートエンジンも導入されたので、両者を比べてみようかと思い、まずDjangoのテンプレートエンジンをいじってみた。

まずわかったのは、Djangoのテンプレーティングで返されるのは、一般的なstrオブジェクトではないこと。テンプレーティング結果をprintでインタープリタに表示しようとしたら、なにも表示されなかった。どうしてかと思いtype()で型を調べたところ、特殊なDjangoオブジェクトだった。

特殊なオブジェクトだとしても文字列として使えればまあ問題はない。空文字と連結を試みたところ、問題なく実行された。そしてunicodeオブジェクトが返された。

# coding: utf-8

from django.template import Context, Template
from django.conf import settings #
settings.configure()
t = Template("My name is {{ name }}.")

c = Context({"name": "JohnDoe"})
x=t.render(c)

print x
print type(x)

print x+""
print type(x+"")


>>>

<class 'django.utils.safestring.SafeUnicode'>
My name is JohnDoe.
<type 'unicode'>



続いてjinja2(Djangoとの重複を避けるため、名前を変えてimportしている)。こちらのテンプレーティング結果は一般的なunicodeオブジェクトが返された。

from jinja2 import Template as JinjaTemp
template = JinjaTemp('Hello {{ name }}!')
x = template.render(name='John Doe')
print x
print type(x)

>>>
Hello John Doe!
<type 'unicode'>




次にDjangoとjinja2のあいだにある相違を挙げるために以下を実行する。

# coding: utf-8

def john_doe():
return "John Doe"

from django.template import Context, Template
from django.conf import settings #
settings.configure()
t = Template("My name is {{ name }}.")
c = Context({"name": john_doe})
print t.render(c)+""

from jinja2 import Template as JinjaTemp
template = JinjaTemp('Hello {{ name }}!')
print template.render(name=john_doe)


>>>
My name is John Doe.
Hello <function john_doe at 0x027FF870>!


文字列"John Doe"を返す関数、john_doeを作って被テンプレート要素nameに渡した。渡したのは関数であって、関数の実行結果ではない。しかしDjangoは実行結果である"John Doe"を表示した。jinja2は関数の情報を表示した。

データベースから引き出したレコードをオブジェクトとして扱うことがある。jinja2を使っているなら値を引き出したい変数がプロパティかメソッドかを見極めて、適宜"()"で締めてやる必要がある。Djangoでは良くも悪くも、変数がプロパティかメソッドかは気にせず、変数名だけを管理できていればいいということだ。

Django
jinja2



蛇足

今回はローカル環境で遊んでいたが...DjangoにはTemplateもContextもインポートしないで済む、render_to_string(template_file_name, template_values)というのがある。ローカル環境で使ってみようと変数TEMPLATE_DIRSを設定した(テンプレートファイルはこのディレクトリから探される)がエラーが出て使えなかった。Djangoはテンプレート結果として返すオブジェクトも、そもそものテンプレート中のオブジェクトの扱いも結構特殊っぽいなぁ。

# coding: utf-8
import os

template_values = {
'foo0': "Camus",
'foo1': "Dostoevsky",
'foo2': "Hesse",
}

from django.template import Context, Template
from django.template.loader import render_to_string
from django.conf import settings

settings.configure(DEBUG=True, TEMPLATE_DEBUG=True,
TEMPLATE_DIRS=('C:/Python26'),
)

django_temp = Template(open('temp.html').read()).render(Context(template_values))
##django_temp = render_to_string("temp.html". template_values)
            

コメントの投稿

非公開コメント

プロフィール

hMatoba

Author:hMatoba
Github

最新記事
リンク
作ったものなど
月別アーカイブ
カテゴリ
タグリスト

検索フォーム
Amazon
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。