flaskのテンプレートについて、公式ドキュメントで勉強しています。
flaskの仕様を知っていくのも大事だね
flaskの公式ドキュメント、「Templates」の項目を勉強し始めました。flask自体の仕様をもう少し詳細に学んでいきたいなと感じたので、まずはTemplatesを勉強しています。
進めているドキュメントはこちらです。
こんな人の役に立つかも
・flaskを勉強している人
・flaskのテンプレートについて勉強している人
・flaskのアプリを作成している人
テンプレートのレンダリング
flaskはJinja2テンプレートエンジンを利用しています。他のテンプレートエンジンも利用できるようです。しかし、flaskを実行するためにはJinja2が必要ということです。
render_template()について
view関数で、「render_template」でテンプレートを利用すると、「.xhml」「.html」「.htm」「.xml」で終わるすべてのテンプレートで「自動エスケープ(autoescaping)」が有効になります。
render_template_string()
「render_template_string()」を利用すると、すべての文字列で「自動エスケープ(autoescaping)」が有効になります。
「render_template_string」は、テンプレートを引数の文字列から作るような関数で、利用するときは、次のようにします。
はじめて利用するので、少し使ってみました。
以前、作成したミニマムなflaskアプリのview関数で利用します。「__init__.py」関数の中のviewのルーティングで「/string」として「render_template_string」試してみました。
from flask import Flask, render_template, render_template_string
app = Flask(__name__)
@app.route('/')
def hello_world():
return render_template('index.html')
#テンプレートを直接文字列として渡します。
@app.route('/string')
def hello_string():
return render_template_string('<h1>Strings death</h1>')
試すと次のようにh1タグが表示されました。
git cloneして、panda-flaskのmin_appアプリの「__init__.py」に「@app.route(‘/string’)」以下のプログラムを追加すると、動作検証ができます。
$ git clone https://github.com/perfectpanda-works/panda-flask.git
以下の手順で、仮想環境を入れて、仮想環境にすべてのPythonモジュールをインストールします。そして、flaskのデバッグ用Webサーバーを立ち上げます。
mac
$ cd panda-flask
$ Python3 -m venv venv
$ . venv/bin/activate
(venv)$ pip install -r requestments.txt
(venv)$ export FLASK_APP=min_app
(venv)$ export FLASK_ENV=development
(venv)$ flask run
windows
> cd panda-flask
> py -3 -m venv venv
> venv¥Scripts¥activate
(venv)> pip install -r requestments.txt
(venv)> set FLASK_APP=min_app
(venv)> set FLASK_ENV=development
(venv)> flask run
ブラウザで「localhost:5000/string」へアクセスします。
{% autoescape %}タグ
{% autoescape %}タグを利用することで、自動エスケープ処理のオンオフができるようです。
次のように、テンプレートファイル内で、Falseとして、endautoescapeタグまでエスケープ処理をしないようにできるみたいです。
{% autoescape False %}
{{ str }}
{% endautoescape %}
この内容は、このTemplatesチュートリアルの後の方に出てきますので、ここでは軽く触れる程度にしておきます。
flaskがJinja2へ追加するグローバル関数とヘルパー
flaskは、Jinja2へ、いくつかのグローバル関数やヘルパーを追加しているらしいです。おそらく、次の項目で紹介するJinja2のテンプレートで使えるコンテキストのproxyなどのことを言っているのかと思います。
Jinja2テンプレートで利用可能なflaskの変数など
コンテキストのproxyである「Config」「request」「session」「g」や、「url_for()」「get_flashed_messages()」関数がJinja2テンプレートの中で利用できます。
チュートリアルで作成したflaskrアプリでの利用例を抜き出してみました。次のように利用されています。
「request」
「blog/create.html」からの引用です。
<form method="post">
<label for="title">Title</label>
<input name="title" id="title" value="{{ request.form['title'] }}" required>
<label for="body">Body</label>
<textarea name="body" id="body">{{ request.form['body'] }}</textarea>
<input type="submit" value="Save">
</form>
「g」
「base.html」内の引用です。
<ul>
{% if g.user %}
<li><span>{{ g.user['username'] }}</span>
<li><a href="{{ url_for('auth.logout') }}">Log Out</a>
{% else %}
<li><a href="{{ url_for('auth.register') }}">Register</a>
<li><a href="{{ url_for('auth.login') }}">Log In</a>
{% endif %}
</ul>
url_for()
「blog/index.html」からの引用です。
{% if g.user %}
<a class="action" href="{{ url_for('blog.create') }}">New</a>
{% endif %}
get_flashed_messages()
「base.html」内からの引用です。
{% for message in get_flashed_messages() %}
<div class="flash">{{ message }}</div>
{% endfor %}
flaskrでは、configとsessionはテンプレート内で利用されていませんでした。