\ BLACK FRYDAY! /

【Django】コンテキストプロセッサーの基本と使い方を解説

  • すべてのビューで同じコンテキストをテンプレートに渡している…
  • 定形的なコンテンツを一律で渡す仕組みはないだろうか?

このようなニーズに応えてくれるのが、Django のコンテキストプロセッサです。

例えばHTMLのメタキーワードなどは、全ページで共通で良い場合も多いと思います。

もちろんbase.htmlにベタ書きしてもOKですが、settings.pyなどに値を書き込んでおいて読み出したい場合もありますよね。

その場合、一般的には以下の流れになります。

  • settings.pyに変数と値を書く
  • views.pyで変数を呼び出す
  • contextとしてテンプレートに渡す

ビューの数が増えれば増えるほど、②と③で同じことを延々と書く必要が出てくるのです。

これを一度で済ます方法が、今回のコンテキストプロセッサーです。

とても便利な機能なので、ぜひ本記事を通してマスターしてみてください!

コンテキストプロセッサの基本を解説

コンテキストプロセッサは、テンプレートのレンダリング時に自動的に変数を追加するものです。

Django のテンプレートシステムの一部という位置付けで、定形的な変数を「毎回ビューからテンプレートに渡す」という手間が省けます。

requestオブジェクトを受け取り、辞書を返す構造になっています。

コンテキストプロセッサの設定方法

大きく、二つの設定を行います。

  • context_processors.py の作成
  • settings.py の追記

順番に確認してきましょう。

context_processors.py の作成

アプリディレクトリにcontext_processors.pyを作成して、以下のように書きます。

from django.conf import settings


def site_metadata(request):
    """
    HTMLメタデータを渡す
    """
    return {
        "meta_description": settings.META_DESCRIPTION,
        "meta_keywords": settings.META_KEYWORDS,
    }

なお、上記のコードではあらかじめsettings.pyにメタデータの内容を記入しておきました。

# メタタグの内容
META_DESCRIPTION = "Input your meta description!"
META_KEYWORDS = "keyword1, keyword2"

続いて、settings.pyTEMPLATES設定にこのコンテキストプロセッサを追加します。

TEMPLATES = [
    {
        "BACKEND": "django.template.backends.django.DjangoTemplates",
        "DIRS": [
            BASE_DIR / "templates",
        ],
        "APP_DIRS": True,
        "OPTIONS": {
            "context_processors": [
                "django.template.context_processors.debug",
                "django.template.context_processors.request",
                "django.contrib.auth.context_processors.auth",
                "django.contrib.messages.context_processors.messages",
                "apps.web.context_processors.site_metadata",  # これを追加
            ],
        },
    },
]

これで、自動的にMETA_DESCRIPTIONMETA_KEYWORDSの二つの値がテンプレートに自動的に渡されます。

Django がデフォルトで提供するコンテキストプロセッサ

Django では特別な設定なしに、次のようなコンテキストプロセッサを提供します。

  • debugsql_queries
  • request
  • userperms
  • media
  • static
  • TIME_ZONE

Django を触ったことのある方なら一度は見覚えがあるものばかりだと思います。

順番に解説していきましょう。

debugsql_queries

debug は、デバッグが有効かどうかをテンプレートで簡単にチェックできるものです。

つまり、settings.pyDEBUGTrueの場合にはTrueを返します。

sql_queries は、リクエストに関連するすべてのSQLクエリのリストを提供します。

パフォーマンスの分析やデバッグに便利です。

django.template.context_processors.debugで提供されます。

request

request 変数をテンプレートに渡します。

これによりテンプレート内で HTTP リクエストオブジェクトに直接アクセスできるようになり、リクエストの各種属性(GET や POST データ)に簡単にアクセスできます。

django.template.context_processors.requestで提供されます。

userperms

user は現在のユーザーのインスタンス。

perms はユーザーの権限に関するオブジェクトです。

この二つにより、テンプレート上でユーザーの「認証状態」や「権限」に基づいた条件分岐が簡単になります。

django.contrib.auth.context_processors.authで提供されます。

media

MEDIA_URL設定をテンプレート内で扱うための変数。

アップロードされた画像などのメディアファイルの URL をテンプレートで簡単に生成するのに役立ちます。

django.template.context_processors.mediaで提供されます。

static

静的ファイルのURLを生成するための STATIC_URL 設定を格納する変数。

CSS ファイルや JavaScript ファイルなど、静的リソースへのリンクを生成するのに便利です。

django.template.context_processors.staticで提供されます。

TIME_ZONE

ユーザーのタイムゾーンを扱うためのものです。

settings.pyで定義されたTIME_ZONE 設定をテンプレートに渡します。

django.template.context_processors.tzで提供されます。

コンテキストプロセッサ使用上の注意

以下の点に気をつけると、便利に使うことができるでしょう。

  • パフォーマンスを意識する
  • 提供するデータを吟味する
  • ビジネスロジックの組み込みは控える

それぞれ解説します。

パフォーマンスを意識する

コンテキストプロセッサは、全リクエストに実行されます。

そのため、不必要に重い処理を担当させてしまうとアプリケーション全体のレスポンスにかかる時間を低下させてしまいます。

提供するデータを吟味する

良くも悪くも「無差別にデータをテンプレートに渡してしまう」ものです。

ユーザー固有の情報などをコンテキストプロセッサに乗せてしまうとセキュリティリスクを高めることになってしまいます。

どの情報を乗せるべきかは、慎重に検討しましょう。

ビジネスロジックの組み込みは控える

コンテキストプロセッサにビジネスロジックを乗せてしまうと、テンプレート側のテストが大変になってしまいます。

大原則として単なる表示に特化したものを用意すべきで、ビジネスロジックを組むことは避けた方が無難だと思います。

コンテキストプロセッサの特徴を理解して上手に使いこなそう!

コンテキストプロセッサは、うまく使いこなせばとても便利な機能です。

  • ビジネスロジックは乗せない
  • セキュリティに気を配る
  • パフォーマンスを意識する

上記を守りつつ、上手に使いこなしてみてください!

この記事が気に入ったら
フォローしてね!

シェア・記事の保存はこちら!

この記事を書いた人

karo@プログラマのアバター karo@プログラマ プログラマ

「書くことで人の役にたつ」をモットーに活動中。
本職はプログラマで、Pythonが得意。
基本情報技術者試験合格。

コメント

コメントする

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)