flaskでWebアプリ開発、テンプレートについて勉強1

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はテンプレート内で利用されていませんでした。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次