LoginSignup
7
8

More than 5 years have passed since last update.

Django1.8 + Jinja2 + hamlish-jinja で Haml生活を送る (Python3)

Posted at

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を更新したときだけファイルのタイムスタンプが更新されるので、よさげです。

おしまい。

7
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
8