佐賀人のIT技術者のブログ

IT技術、日常のブログです。たまに地元・佐賀について書きます。

FlaskのJinjaで自作関数・自作フィルタを追加する方法

FlaskではJinjaテンプレートエンジンを用いてHTMLを生成しますが、標準のフィルタや関数だけでは要件を満たせない場合があります。その際、自作の関数やフィルタをJinjaに追加して活用することができます。本記事では、その具体的な方法を解説します。

1. 自作フィルタの追加方法

フィルタとは?

Jinjaでは、テンプレート内でデータを加工するために「フィルタ」を使用できます。たとえば、upperフィルタを使って文字列を大文字に変換するなどが可能です。

自作フィルタの手順

  1. Python関数を作成
  2. 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.htmlreverseフィルタを使用できます。

<!DOCTYPE html>
<html>
<head>
    <title>Custom Filter Example</title>
</head>
<body>
    <h1>{{ name | reverse }}</h1>
</body>
</html>

出力結果:

FlaskksalF

2. 自作関数の追加方法

関数とは?

テンプレート内で直接呼び出して使用する機能を関数として登録できます。フィルタとの違いは、引数や用途の柔軟性です。

自作関数の手順

  1. Python関数を作成
  2. 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アーキテクチャをアプリケーションファクトリパターンと呼ぶみたいですね。