Flask-templates
フラスコ–テンプレート
特定のURLにバインドされた関数の出力をHTML形式で返すことができます。 たとえば、次のスクリプトでは、* hello()関数は *'hello World' に <h1> タグを付加してレンダリングします。
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return '<html><body><h1>Hello World</h1></body></html>'
if __name__ == '__main__':
app.run(debug = True)
ただし、PythonコードからHTMLコンテンツを生成することは、特に変数データや条件やループなどのPython言語要素を配置する必要がある場合は面倒です。 これには、HTMLから頻繁にエスケープする必要があります。
ここで、Flaskのベースとなっている Jinja2 テンプレートエンジンを利用できます。 関数からハードコードHTMLを返す代わりに、* render_template()*関数によってHTMLファイルをレンダリングできます。
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return render_template(‘hellol’)
if __name__ == '__main__':
app.run(debug = True)
Flaskは、このスクリプトが存在するのと同じフォルダー内のテンプレートフォルダーでHTMLファイルを見つけようとします。
- アプリケーションフォルダー
- Hello.py
- テンプレート
- こんにちは
- 「ウェブテンプレートシステム」*という用語は、変数データを動的に挿入できるHTMLスクリプトの設計を指します。 Webテンプレートシステムは、テンプレートエンジン、ある種のデータソース、およびテンプレートプロセッサで構成されます。
Flaskは jinja2 テンプレートエンジンを使用します。 Webテンプレートには、変数と式(これらの場合はPython式)のHTML構文が散在するプレースホルダーが含まれており、テンプレートのレンダリング時に値が置き換えられます。
次のコードは、テンプレートフォルダーに hellol として保存されます。
<!doctype html>
<html>
<body>
<h1>Hello {{ name }}!</h1>
</body>
</html>
次に、Pythonシェルから次のスクリプトを実行します。
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/hello/<user>')
def hello_name(user):
return render_template('hellol', name = user)
if __name__ == '__main__':
app.run(debug = True)
開発サーバーの実行が開始されたら、ブラウザーを開いてURLを入力します- http://localhost:5000/hello/mvl
URLの*変数*部分は、 \ {\ {name}} プレースホルダーに挿入されます。
*jinja2* テンプレートエンジンは、HTMLからのエスケープに次の区切り文字を使用します。
- \ {%… ステートメントの%}
- \ {\ {… }}は、テンプレートの出力に出力する式
- \ {#… #}テンプレート出力に含まれないコメントの場合 *#… ##行ステートメント
次の例では、テンプレートでの条件ステートメントの使用を示しています。* hello()関数のURLルールは整数パラメーターを受け入れます。 *hellol テンプレートに渡されます。 その中で、受け取った数値(マーク)の値が比較され(50より大きいか小さい)、それに応じてHTMLが条件付きでレンダリングされます。
Pythonスクリプトは次のとおりです-
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/hello/<int:score>')
def hello_name(score):
return render_template('hellol', marks = score)
if __name__ == '__main__':
app.run(debug = True)
*hellol* のHTMLテンプレートスクリプトは次のとおりです-
<!doctype html>
<html>
<body>
{% if marks>50 %}
<h1> Your result is pass!</h1>
{% else %}
<h1>Your result is fail</h1>
{% endif %}
</body>
</html>
条件文 if-else および endif は、区切り文字 \ {%..%} で囲まれていることに注意してください。
Pythonスクリプトを実行し、URL http://localhost/hello/60 にアクセスしてから、 http://localhost/hello/30 にアクセスして、条件に応じて変化するHTMLの出力を確認します。
Pythonループ構造は、テンプレート内でも使用できます。 次のスクリプトでは、* result()関数は、ブラウザーでURL *http://localhost:5000/result が開かれると、テンプレート resultsl に辞書オブジェクトを送信します。
*resultl* のテンプレート部分では、* forループ*を使用して、辞書オブジェクト *result \ {}* のキーと値のペアをHTMLテーブルのセルとしてレンダリングします。
Pythonシェルから次のコードを実行します。
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/result')
def result():
dict = {'phy':50,'che':60,'maths':70}
return render_template('resultl', result = dict)
if __name__ == '__main__':
app.run(debug = True)
次のHTMLスクリプトを resultl としてテンプレートフォルダーに保存します。
<!doctype html>
<html>
<body>
<table border = 1>
{% for key, value in result.items() %}
<tr>
<th> {{ key }} </th>
<td> {{ value }} </td>
</tr>
{% endfor %}
</table>
</body>
</html>
ここでも、 For ループに対応するPythonステートメントは\ {%..%}で囲まれていますが、式 keyおよびvalue は \ {\ {}} 内に配置されています。
開発の実行が開始されたら、ブラウザーで http://localhost:5000/result を開き、次の出力を取得します。