HamlをPython(Flask)でも使いたい
自宅というか趣味ではRubyを使ってたんですが、最近仕事でPythonを書くことが多く、書式の違いにあたふたしている今日このごろです。 あまりに頭が混乱するのでちょっとRubyはお休みです。 Rubyは書いてて楽しいと感じられる言語ですが、Pythonも十分に楽しい言語です。 思想は似てるようで似てないようで、その違いを感じながら書くのもなかなか楽しいものです。 さて、RubyでWebアプリを書いてく中でHamlというmarkup languageに出会いました。 書き方によっては構造がわかりにくくなってしまうHTMLですが、Hamlを使うことで構造がきっちり見えるようになります。 PythonでもFlaskを使う機会があり、View部分にHaml(あるいはそれに類似したもの)を使えないものかと調べていたんですが、ありました、そのものずばりが。
FlaskはテンプレートエンジンとしてJinjaを使っていますが、Hamlish-jinjaはJinjaでHamlの書式が使えるようにしたExtentionのようです。
Hamlish-jinjaを入れてみた
今回はOSX環境に、pyenv + virtualenvでHamlの使えるFlask環境を作ります。 以前のエントリでOSXにpyenvを入れてました。 ここに、virtualenvを入れて環境を構築します。
私はzshを使っているんですが、.zshrcはgithubで管理し、LinuxでもOSXでもFreeBSDでも基本的にはこの.zshrcを共用しています。.zshrcでのpyenvの設定は次のようになっています。
if [ "$(uname)" = "Darwin" ]; then if which pyenv > /dev/null; then export CFLAGS="-I$(xcrun --show-sdk-path)/usr/include" export PYENV_ROOT="${HOME}/.pyenv" export PATH=${PYENV_ROOT}/shims:${PATH} eval "$(pyenv init -)"; fi else if [ -f "$HOME/.pyenv/bin/pyenv" ]; then export PYENV_ROOT="${HOME}/.pyenv" export PATH=${PYENV_ROOT}/bin:$PATH eval "$(pyenv init -)"; fi fi
OSXでは、pyenvでpythonをインストールする際に「CFLAGS=”-I$(xcrun —show-sdk-path)/usr/include”」という環境変数が必要です。(詳細は以前のエントリを参照) 事前に.zshrcで設定されるようにしてあります。
homebrew環境を更新後、virtualenvをインストールします。 Pythonも最新にし、Flask+Haml専用のテスト環境を作成します。
$ brew update $ brew install pyenv-virtualenv $ pyenv install 3.4.2 $ pyenv virtualenv 3.4.2 3.4.2-hamlish $ mkdir ~/work/hamlish $ cd ~/work/hamlish $ pyenv local 3.4.2-hamlish $ pip install Flask Hamlish-Jinja
環境変数CFLAGSが設定されてない場合は、「CFLAGS=”-I$(xcrun —show-sdk-path)/usr/include” pyenv install 3.4.2」とした方がいいかもしれません。
FlaskでHamlを使ってみる
では、実際にFlaskでHamlを利用してみます。 app.py、templates/index.hamlを用意します。
app.py
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('/') @app.route('/<name>') def index(name=None): return render_template('index.haml', name=name) if __name__ == '__main__': app.debug = True app.run()
templates/index.haml
%h1 Hamlish %p User: {{name}}
では実行してます。
$ python app.py * Running on http://127.0.0.1:5000/ * Restarting with reloader
PythonでもHamlが利用できました。
便利ですね
Hamlishを見つけたこと自体も嬉しかったんですが、pyenv+virtualenvの便利さを痛感しました。rbevnもですが、久しくコードの世界から離れていると浦島状態でいろんなことに感動できます。