また新しい何かが出てきましたね。
こんてきすとぷろせっさー
flaskのテンプレートについて勉強をしています。今回は、チュートリアルのテンプレートの最後の項目、「Template Processor」を動作させて検証していきたいと思います。
チュートリアルページはこちらになります。
こんな人の役に立つかも
・flaskを勉強している人
・flaskのテンプレートについて勉強している人
・flaskのテンプレートへ変数、関数を独自に定義したい人
コンテキストプロセッサーについて
コンテキストプロセッサーは、テンプレート内で自由に利用できる「変数」や「関数」をviewのプログラムで定義できる便利な機能です。
チュートリアルにそれぞれ、変数と関数を定義するプログラムがありますので、それを以前作成したミニマムなflaskアプリに実装して動作を確かめたいと思います。
ミニマムなflaskアプリについては、こちらの記事をご参照ください。(すぐに利用するときは、最後の項目の「GitHubからcloneして利用」をご覧ください。
view関数のプログラム
コンテキストプロセッサーはデコレータ「@app.context_processor」でviewプログラムの中に定義します。
「__init__.py」に次のプログラムを追加します。
#①テンプレート内で変数を利用できるようにするコンテキストプロセッサー
@app.context_processor
def inject_data():
return dict(data1="panda")
#②テンプレート内で関数を利用できるようにするコンテキストプロセッサー
@app.context_processor
def utility_processor():
def format_price(amount, currency=u'€'):
return u'{0:.2f}{1}'.format(amount, currency)
return dict(format_price=format_price)
①テンプレートで利用可能な変数を定義
①のプログラムでは、コンテキストプロセッサーの最後、returnにdict(data=”death”)とすることで、テンプレート内で「data」と入れるだけで文字列「death」を表示できるようになります。チュートリアルでは、ここが「g.user」とアプリケーションコンテキストのproxyを入れています。このようにすることで、テンプレート内でgを利用してgオブジェクトを読み込むのではなく、一律して変数名で表示することができるようになりますので、とても便利です。
②テンプレートで利用可能な関数を定義
②では、テンプレートで利用可能な関数を定義しています。テンプレート中で利用する関数名は、「utility_processor」の中の「format_price」ですので、少し注意が必要です。
機能的には、フィルタに似ている点もあります。今回の文字列に通貨の単位を付け足すような処理はフィルタでも実現することができますね。
関数的な利用ではフィルタのほうがわかりやすいイメージがあります。
表示テンプレートにタグを埋め込む
「templates/index.html」を次のように書き換えます。
<!doctype html>
<h1>INDEX death</h1>
<h2>{{ data1 }}</h2>
<h2>{{ format_price(0.33) }}</h2>
追加した2行にて、それぞれ変数の表示、値の変換を行っています。
個人的に勘違いしたこと
テンプレートに埋め込むタグの変数で少し迷いました。最初、間違えてdefの方の関数を埋め込んでいて、うまく動かないな~ともごもごしていました。
赤枠で囲った、returnに指定しているdictのキーワード部分を利用するようですね。
ずっとinject_data()とか埋め込んでました・・・
動作検証
最後に、テンプレートが機能しているかを検証します。
Python仮想環境でflaskのデバッグ用サーバーを立ち上げ、ブラウザから「localhost:5000/」にアクセスします。
※ミニマムなflaskアプリをgit cloneして、venv環境を立ち上げておく必要があります。
mac
(venv)$ export FLASK_APP=min_app
(venv)$ export FLASK_ENV=development
(venv)$ flask run
windows
(venv)> set FLASK_APP=min_app
(venv)> set FLASK_ENV=development
(venv)> flask run
ブラウザで動作検証すると、次のようにデータが表示されていることがわかります。
データの変換は、カスタマイズしたフィルターを使おうかな・・・