読者です 読者をやめる 読者になる 読者になる

人生リアルタイムアタック

当面はPython学習帳

FlaskでもHamlを使う - hamlish-jinja

Flask 最近書いてるんだけれども、今更閉じタグなんて書きたくないんじゃ!ということで、様々HTML Template触った結果最も書きやすかったHamlを使いたい。

ということで hamlish-jinja を使う。

使い方の基本

Flaskのdefault template engineであるjinjaのoptionsに、hamlish-jinjaを渡したclassを生成して実行する。

from flask import Flask, render_template
from werkzeug import ImmutableDict


class FlaskWithHamlish(Flask):
    jinja_options = ImmutableDict(
        extensions=['jinja2.ext.autoescape', 'jinja2.ext.with_', 'hamlish_jinja.HamlishExtension']
    )
app = FlaskWithHamlish(__name__)


@app.route('/')
def index():
    return render_template('index.haml')

if __name__ == '__main__':
    app.run()

オプション

hamlish-jinjaには幾つかのオプションが用意されている。 以下はその一例。

  • app.jinja_env.hamlish_enable_div_shortcut = True
    • divタグを省略可能にする。div.classname を .classnameだけで記述可能になる
  • app.jinja_env.hamlish_mode = 'indented'
    • 出力HTMLにインデントをつける。開発中はこちらが良いだろう。

https://github.com/Pitmairen/hamlish-jinja#configuration

Syntaxについて

あくまでHamlishであって、Hamlと全く同じではない。

複数のAttributeを {} で記述できない。

Hamlで可能な記述(hamlish-jinjaでは不可)

    %meta {name:'viewport', content:'width=device-width, initial-scale=1'}

hamlish-jinjaで可能な記述

    %meta name='viewport' content='width=device-width, initial-scale=1'

!!!5 が適用されない。

他の方法でできるからいいじゃんという話になっている。

Added doctype strings. by totkeks · Pull Request #15 · Pitmairen/hamlish-jinja · GitHub

このケースでは、app.py側に以下のように書いたらいいじゃんという話。

import jinja2 

jinja_env.globals['html5'] = jinja2.Markup('<!DOCTYPE html>')

つまり、hamlとまったく同じ記述ができるというわけではなく、あくまでもhamlっぽく書けるという話。

コメント書式が異なる

hamlish-jinjaでのコメントは ; です。なんでや。

;Test comment

hamlからhamlishに変換したい

↓ を使いましょう。

hamlish-jinja/haml2hamlish.py at master · Pitmairen/hamlish-jinja · GitHub

まとめ

それでもhamlishなtemplateは記述量の少なさから得られる恩恵が大きいのでもうちょっと使って見る予定。 とはいえ、hamlと完全互換では無いので、そこの差異を認識した上で利用するのが望ましそう。