Jinja2テンプレートエンジン、使いこなすと色々と面白そうです。
テンプレートエンジンは色々あるけれど、とりあえずJinja2マスターしてみたいね
flaskのテンプレートについてチュートリアルの勉強を進めています。今回は、Jinja2の「フィルタ」という概念も出てきます。ということで、少しだけフィルタとは何か?という点も、Jinja2に食い込みつつ、勉強を進めていきました。
進めているドキュメントはこちらのページになります。
こんな人の役に立つかも
・flaskを勉強している人
・flaskのテンプレートについて勉強している人
・flaskのアプリを作成している人
標準のフィルタについて
flaskのテンプレートファイルの中では「フィルタ」というJinja2の機能が利用できます。
「フィルタ」は、文字をエスケープしたり、テンプレートに渡された値を、テンプレートで何かしら変換処理を行うような機能です。
日本語、難しいね。実際の例で見るとわかりやすいですね。
Jinja2テンプレートのフィルタ
Jinja2テンプレートエンジンでは、「filter」をテンプレートで利用するときに、次のように利用します。
{{ オブジェクト | フィルター名 }}
このようにオブジェクトとフィルターを「パイプ」で繋ぐことでフィルターを追加することができます。オブジェクトには、フィルターで定義された処理が施されます。
オブジェクトはリストであったり、flaskの「gオブジェクト」であったり、色々取ることができるみたいです。
また、詳細な情報は、Jinja2のドキュメントにJinja2の組み込みフィルター一覧がありましたので、リンクをしておきます。
Jinja2の組み込みフィルタ一覧はこちらです。
Jinja2のドキュメントはこちらです。
Jinja2に標準で搭載されているフィルタに加えて、flaskが用意している次のフィルタが利用できます。
標準のフィルタだけでも色々なものがあるんですね。
tojason()
tojasonは、flaskが準備しているフィルタで、オブジェクトをjson形式に変換してくれるようです。その場でjavascriptを生成しようとしたときに役立つそうです。
<script type=text/javascript>
doSomethingWith({{ user.username|tojson }});
</script>
「’」(シングルクォーテーション)で囲まれたHTML属性の中でも安全に利用できるとのことです。
<button onclick='doSomethingWith({{ user.username|tojson }})'>
Click me
</button>
Webアプリを作成して、テンプレートも色々と複雑なことをしたくなったら、役に立ちそうです。
自動エスケープ処理
基本的に、Jinja2やflaskが用意してくれた機能を利用していると、デフォルトでエスケープ処理が施されます。一方で、エスケープが不要な場合があるとのことです。
例えば、もともと、安全なHTMLを生成するシステムから受け取る場合は、エスケープを明示的に外す、という処理が必要になる場合があります。
こんな時は、「autoescape」タグを利用することで一時的にエスケープを無効にすることができるようです。
{% autoescape false %}
<p>autoescaping is disabled here
<p>{{ will_not_be_escaped }}
{% endautoescape %}
この項目は、前回の記事にも触りが出てきました。他にも方法がありますが、タグを使う方法だと、シンプルにテンプレート内で明示的に「エスケープしていません」と理解することができて、便利そうです。もちろん、渡すべき文字列の内容は、本当に大丈夫なのか、十分注意しておく必要がありますね。
今回は、概念的な部分ばかりになってしましましたが、次の項目のフィルタをカスタマイズする部分で、実装が少し長くなりそうです。次回は引き続きテンプレートのフィルタについて理解を深めていきたいと思います。フィルタのカスタマイズを具体的に実装したいと思います。