FlaskではJinjaテンプレートエンジンを用いてHTMLを生成しますが、標準のフィルタや関数だけでは要件を満たせない場合があります。その際、自作の関数やフィルタをJinjaに追加して活用することができます。本記事では、その具体的な方法を解説します。
1. 自作フィルタの追加方法
フィルタとは?
Jinjaでは、テンプレート内でデータを加工するために「フィルタ」を使用できます。たとえば、upperフィルタを使って文字列を大文字に変換するなどが可能です。
自作フィルタの手順
- Python関数を作成
- Flaskアプリケーションに登録
実装例 以下の例では、文字列を逆順にするフィルタを作成します。
from flask import Flask, render_template app = Flask(__name__) # 自作フィルタ関数 def reverse_string(s): return s[::-1] # フィルタを登録 app.jinja_env.filters['reverse'] = reverse_string @app.route('/') def index(): return render_template('index.html', name="Flask") if __name__ == '__main__': app.run(debug=True)
テンプレート側での使用例
以下のようなindex.html
でreverse
フィルタを使用できます。
<!DOCTYPE html> <html> <head> <title>Custom Filter Example</title> </head> <body> <h1>{{ name | reverse }}</h1> </body> </html>
出力結果:
Flask
→ ksalF
2. 自作関数の追加方法
関数とは?
テンプレート内で直接呼び出して使用する機能を関数として登録できます。フィルタとの違いは、引数や用途の柔軟性です。
自作関数の手順
- Python関数を作成
- Flaskアプリケーションに登録
実装例 以下の例では、現在の日付を取得する関数を作成します。
from flask import Flask, render_template from datetime import datetime app = Flask(__name__) # 自作関数 def current_date(): return datetime.now().strftime("%Y-%m-%d") # 関数を登録 app.jinja_env.globals['current_date'] = current_date @app.route('/') def index(): return render_template('index.html') if __name__ == '__main__': app.run(debug=True)
テンプレート側での使用例
index.html
で以下のように呼び出します。
<!DOCTYPE html> <html> <head> <title>Custom Function Example</title> </head> <body> <h1>Today is {{ current_date() }}</h1> </body> </html>
出力例:
Today is 2024-11-29
Blueprintアーキテクチャでの登録手順
Blueprintアーキテクチャを使用している場合でも、フィルタや関数を登録する手順は同じです。ファクトリ関数の中でjinja_envを操作します。
from flask import Flask from datetime import datetime def create_app(): app = Flask(__name__) # 自作フィルタを登録 def reverse_string(s): return s[::-1] app.jinja_env.filters['reverse'] = reverse_string # 自作関数を登録 def current_year(): return datetime.now().year app.jinja_env.globals['current_year'] = current_year # Blueprintを登録 from blueprints.main import main app.register_blueprint(main) return app
ファクトリ関数で生成したアプリケーションオブジェクトを使えば、Blueprint全体で共通のフィルタや関数を利用できます。
まとめ
FlaskのJinjaで自作フィルタや関数を追加することで、テンプレートの表現力を大幅に向上させることができます。本記事では以下を解説しました:
- 自作フィルタの追加方法
- 自作関数の登録手順
- Blueprintアーキテクチャでの登録手順
ちなみに、Blueprintアーキテクチャをアプリケーションファクトリパターンと呼ぶみたいですね。