today::エンジニアに憧れる非エンジニア

今のところは、エンジニアとは言えないところの職種です。しかしエンジニア的なものの考え方に興味津津。

Pythonあれこれ 2021-02-20 - Webアプリケーションに、テンプレートに基づいたHTMLを返す動作を実装する

概要

「Head First Python 第2版」を進めていった中で考えたことの記録です。

Head First Python 第2版 ―頭とからだで覚えるPythonの基本

Head First Python 第2版 ―頭とからだで覚えるPythonの基本

  • 作者:Paul Barry
  • 発売日: 2018/03/24
  • メディア: 単行本(ソフトカバー)

Webアプリケーションのコード

from flask import Flask, render_template
from vsearch import search4letters

app = Flask(__name__)


# ...略...


@app.route('/entry')
def entry_page() -> str:
  return render_template('entry.html',
                         the_title='Web版のsearch4lettersにようこそ!')

app.run()

コード各部分について解説

テンプレートエンジンを使うための関数をインポートする

from flask import Flask, render_template

FlaskによるWebアプリケーションでテンプレートエンジンを使う操作は、flaskライブラリのrender_template関数1に定義されています。Webアプリケーションに「テンプレートに基づいたHTMLを返す」という動作を実装するためには、同関数をインポートする必要があります。

というわけで、flaskライブラリからインポートする関数として、render_templateを新たに追加しています。Flaskクラスのほうは、基本的なWebアプリケーションを定義する段階で既にインポートしていたものです。

テンプレートとキーワード引数に基づき、HTMLを生成して返す関数を定義する

@app.route('/entry')
def entry_page() -> str:
  return render_template('entry.html',
                         the_title='Web版のsearch4lettersにようこそ!')

先程importしたflaskライブラリのrender_template関数を用いて、/entryというURLにアクセスした際に返されるHTMLの内容を定義しています。Webブラウザの利用者側から見た全体動作としては、「第1引数で与えたテンプレートの内容を元にして、内部でJinja2テンプレートエンジンを用い、キーワード引数の内容も含めたHTTPレスポンスボディ内容を返す2」という動作をします。

render_templateの第1引数であるentry.htmlの内容については、下記記事のうち、項「入力フォーム」に記載しています。ベーステンプレートであるbase.htmlは、entry.htmlの内部で呼び出されています。

rapidliner0.hatenablog.com

render_templateのキーワード引数the_titleは、テンプレート中の以下の記述に対応するものです。

<title>{{ the_title }}</title>

↑ベーステンプレートbase.html中のtitle要素の中身

<h2>{{ the_title }}</h2>

↑入力フォームテンプレートentry.html中のh2要素の中身

キーワード引数the_titleが存在することにより、実際に生成されるHTMLのうち、上記2つの要素の内容には「Web版のsearch4lettersにようこそ!」という文字列が設定されることになります。


  1. jinja2ライブラリの使用については、render_template関数が適切に行なってくれます。

  2. 対応するHTTPレスポンスヘッダの内容は、Flask側で適切に生成されます。