- すべてのビューで同じコンテキストをテンプレートに渡している…
- 定形的なコンテンツを一律で渡す仕組みはないだろうか?
このようなニーズに応えてくれるのが、Django のコンテキストプロセッサです。
例えばHTMLのメタキーワードなどは、全ページで共通で良い場合も多いと思います。
もちろんbase.htmlにベタ書きしてもOKですが、settings.pyなどに値を書き込んでおいて読み出したい場合もありますよね。
その場合、一般的には以下の流れになります。
- settings.pyに変数と値を書く
- views.pyで変数を呼び出す
- contextとしてテンプレートに渡す
ビューの数が増えれば増えるほど、②と③で同じことを延々と書く必要が出てくるのです。
これを一度で済ます方法が、今回のコンテキストプロセッサーです。
とても便利な機能なので、ぜひ本記事を通してマスターしてみてください!
コンテキストプロセッサの基本を解説
コンテキストプロセッサは、テンプレートのレンダリング時に自動的に変数を追加するものです。
Django のテンプレートシステムの一部という位置付けで、定形的な変数を「毎回ビューからテンプレートに渡す」という手間が省けます。
コンテキストプロセッサの設定方法
大きく、二つの設定を行います。
- 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.py
のTEMPLATES
設定にこのコンテキストプロセッサを追加します。
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_DESCRIPTION
とMETA_KEYWORDS
の二つの値がテンプレートに自動的に渡されます。
Django がデフォルトで提供するコンテキストプロセッサ
Django では特別な設定なしに、次のようなコンテキストプロセッサを提供します。
debug
とsql_queries
request
user
とperms
media
static
TIME_ZONE
Django を触ったことのある方なら一度は見覚えがあるものばかりだと思います。
順番に解説していきましょう。
debug
と sql_queries
debug
は、デバッグが有効かどうかをテンプレートで簡単にチェックできるものです。
つまり、settings.py
のDEBUG
がTrue
の場合にはTrue
を返します。
sql_queries
は、リクエストに関連するすべてのSQLクエリのリストを提供します。
パフォーマンスの分析やデバッグに便利です。
request
request
変数をテンプレートに渡します。
これによりテンプレート内で HTTP リクエストオブジェクトに直接アクセスできるようになり、リクエストの各種属性(GET や POST データ)に簡単にアクセスできます。
user
と perms
user
は現在のユーザーのインスタンス。
perms
はユーザーの権限に関するオブジェクトです。
この二つにより、テンプレート上でユーザーの「認証状態」や「権限」に基づいた条件分岐が簡単になります。
media
MEDIA_URL
設定をテンプレート内で扱うための変数。
アップロードされた画像などのメディアファイルの URL をテンプレートで簡単に生成するのに役立ちます。
static
静的ファイルのURLを生成するための STATIC_URL
設定を格納する変数。
CSS ファイルや JavaScript ファイルなど、静的リソースへのリンクを生成するのに便利です。
TIME_ZONE
ユーザーのタイムゾーンを扱うためのものです。
settings.py
で定義されたTIME_ZONE
設定をテンプレートに渡します。
コンテキストプロセッサ使用上の注意
以下の点に気をつけると、便利に使うことができるでしょう。
- パフォーマンスを意識する
- 提供するデータを吟味する
- ビジネスロジックの組み込みは控える
それぞれ解説します。
パフォーマンスを意識する
コンテキストプロセッサは、全リクエストに実行されます。
そのため、不必要に重い処理を担当させてしまうとアプリケーション全体のレスポンスにかかる時間を低下させてしまいます。
提供するデータを吟味する
良くも悪くも「無差別にデータをテンプレートに渡してしまう」ものです。
ユーザー固有の情報などをコンテキストプロセッサに乗せてしまうとセキュリティリスクを高めることになってしまいます。
どの情報を乗せるべきかは、慎重に検討しましょう。
ビジネスロジックの組み込みは控える
コンテキストプロセッサにビジネスロジックを乗せてしまうと、テンプレート側のテストが大変になってしまいます。
大原則として単なる表示に特化したものを用意すべきで、ビジネスロジックを組むことは避けた方が無難だと思います。
コンテキストプロセッサの特徴を理解して上手に使いこなそう!
コンテキストプロセッサは、うまく使いこなせばとても便利な機能です。
- ビジネスロジックは乗せない
- セキュリティに気を配る
- パフォーマンスを意識する
上記を守りつつ、上手に使いこなしてみてください!
コメント