Django で Hamるには、HamlPy とかがあるんだけどPython3多分対応してない。
というかPython3だとあんまり選択肢なさそうで、わりと枯れている hamlish-jinja がよさげだと思いました。
hamlish-jinja は、あくまでも、haml-ish syntax とのことで、Hamlではないんですけど、使って見た感じ、Pythonic でかなり幸せになれると思いました。学習コストもほぼ0だと思う!
https://github.com/Pitmairen/hamlish-jinja
でまあ、そのためにはテンプレエンジンにJinja2 つかわないといけないんだけど、まあ、そのために変えるってのもなんかやな話なんですけど、純粋にJinja2のほうが好きだし、別にHamlのためとかじゃないし、神社とか仏閣とか好きだし、と言い聞かせて変えます。
以下使うためにやったこと。
Jinja2使う
http://qiita.com/ryu22e/items/e50f8a3fbd6fe836c1b4
1.8 からテンプレ周りの設定方法がかなり変わってる!!!! あとJinja2が簡単に導入できるらしい!!!!!
でも、細かいことやろうとするとけっこうしんどいので、結局いつもどおり pip django-jinja
するとかなり楽にできます。設定方法も詳しい。match_regex とかで、URLによってどのバックエンド使うか切り替えたりできる。のでこれでいいとおもう。
http://niwinz.github.io/django-jinja/
hamlish-jinja 入れる
pip install hamlish-jinja
で、ぼくのsetting.py はこうなった。
from django_jinja.builtins import DEFAULT_EXTENSIONS
from hamlish_jinja import HamlishExtension
TEMPLATES = [
{
"BACKEND": "django_jinja.backend.Jinja2",
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'match_regex': r"^(?!admin/).*",
'match_extension': ".haml",
'extensions': DEFAULT_EXTENSIONS + [HamlishExtension]
},
},
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
これで、 いつものテンプレートディレクトリに XXX.haml を置いて、view で XXX.haml とか指定すると普通にうごきます。
%html
%head
%meta charset='utf-8'
%meta name='viewport' content='width=device-width'
%meta name='format-detection' content='telephone=no'
%meta name='description' content={{description}}
%meta name='keywords' content={{keywords}}
%title << {{title}}
%script type='text/javascript' src='http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js'
いいね。
ただ一点 hamlish-jinja 単体には、先にjinjaテンプレートにコンパイルしとくとかの仕組みが一切ないので、多分このままだと本番投入きつい。
そこで、 jinja2 自体のキャッシュ機構を使うことにします。 jinjaのバイトコードでキャッシュしておけば、hamlがーみたいなのは関係なくなる。はず。
こうなりました。
from jinja2 import FileSystemBytecodeCache
...
...
TEMPLATES = [
{
"BACKEND": "django_jinja.backend.Jinja2",
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'match_regex': r"^(?!admin/).*",
'match_extension': ".haml",
'extensions': DEFAULT_EXTENSIONS + [HamlishExtension],
'bytecode_cache': FileSystemBytecodeCache(directory=os.path.join(BASE_DIR, 'project/cache'), pattern='%s.cache'),
},
},
...
指定したcache ディレクトリにファイルが適宜たまってく。hamlを更新したときだけファイルのタイムスタンプが更新されるので、よさげです。
おしまい。