はじめに
Python 内から HTML を生成するのは面白くなく、実際にはとても面倒くさいです。なぜなら、アプリケーションをセキュアに保つために、独自に escape を使って HTML エスケープを行わなければならないからです。そのため、Flask は自動的に Jinja2 テンプレートエンジン を設定します。テンプレートを使って任意の種類のテキストファイルを生成することができます。Web アプリケーションの場合、主に HTML ページを生成しますが、マークダウン、メール用の平文など、他の何でも生成できます。
この実験では、Jinja2 テンプレートエンジンを使ってセキュアで動的なテンプレートを生成する方法を学びます。
テンプレートをレンダリングする
このステップでは、Jinja2 テンプレートエンジンを使ってテンプレートレンダリングを実装します。
rendering_templates.pyファイルを開き、まずFlaskクラスとrender_templateをインポートします。その後、Flaskクラスのインスタンスを作成します。
from flask import Flask, render_template
app = Flask(__name__)
- 次に、
route()デコレータを使って、共有する 1 つのビュー関数hello用の 2 つのルート/と/<name>を作成します。テンプレートをレンダリングするには、render_template()メソッドを使うことができます。これは、Flask によって提供され、Jinja2 テンプレートエンジンを使ってテンプレートをレンダリングするためのものです。必要なことは、テンプレートの名前 と、キーワード引数としてテンプレートエンジンに渡したい 変数 を提供するだけです。ビュー関数では、render_template()メソッドを使って、nameという変数を持つhello.htmlテンプレートをレンダリングします。
@app.route('/')
@app.route('/<name>')
def hello(name=None):
return render_template('hello.html', name=name)
- スクリプトの
mainエントリポイントを作成して、Flask アプリケーションをポート(例えば port=5000)で起動します。その後、debugモードを有効にします。
if __name__ == "__main__":
app.run(host='0.0.0.0', port=5000, debug=True)
- Flask は、デフォルトで templates フォルダ内を探してテンプレートを探します。そのため、
templatesという名前のフォルダを作成し、そのフォルダの下にhello.htmlという名前のファイルを作成する必要があります。端末で次のコマンドを実行することで、必要なフォルダとファイルを作成できます。
cd ~/project
mkdir templates
cd templates
touch hello.html
templates/hello.htmlファイルを開き、次のコードを書きます:
<!doctype html>
<title>Hello from Flask</title>
{% if name %}
<h1>Hello {{ name }}!</h1>
{% else %}
<h1>Hello, World!</h1>
{% endif %}
上記のコードは、Jinja2 の 条件分岐ブロック を使っています。これは、name 変数が真偽値(None でも空でもない)であるかどうかを確認します。もしそうなら、Hello {{ name }}! の内容が表示されます。そうでなければ、Hello, World! の内容が表示されます。
- アプリケーションを実行するには、まず端末で次のコマンドを使って Flask アプリケーションを起動します:
cd ~/project
python3 rendering_templates.py
- 次に、インターフェイス上部にある "Web 5000" タブを開き、インターフェイスを更新します。すると、Hello, World! が表示されるページが見えるはずです。


- ルート
/<name>の場合、URL バーに直接接尾辞を追加することができます。たとえば、ポート 5000 の URL バーに接尾辞flaskを入力すると、出力として Hello, flask! が表示されます。
URL バーに異なる /<name> パスを試してみると、出力も対応して変化します。
まとめ
この実験では、render_template() メソッドを使って Jinja2 テンプレートエンジンを使ってテンプレートをレンダリングする方法を学びました。このメソッドは、テンプレートを生き生きとレンダリングするだけでなく、自動的なエスケープも可能にし、潜在的な XSS 攻撃を防ぐのに役立ちます。
