Flask-templates

提供:Dev Guides
移動先:案内検索

フラスコ–テンプレート

特定の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}} プレースホルダーに挿入されます。

Webテンプレートシステムの例

*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 を開き、次の出力を取得します。

テーブルテンプレートの例