自動化無しに生活無し

WEBとかAIとかLinux関係をひたすら書く備忘録系ブログ

【Django】views.pyの事前処理 VS (埋め込み型)カスタムテンプレートタグ・フィルタ

thumbnail

思考停止状態でカスタムテンプレートタグを作っているとき、ふと気づいた。

『これ、views.pyで事前に処理をしたほうが良いのではないか』と。

考察に至った背景

カスタムテンプレートタグは基本的にviews.pyがレンダリングをする段階で動作する。

つまりそれは、クライアントにレスポンスが届く直前であり、サーバーサイドが介入できる最後の処理である。

故に、『カスタムテンプレートタグを実行した後に、任意の処理を実行することはできない』と考えたほうが良いだろう。

JavaScript等のフロントの処理系に押し付けることもできるが、データはクライアントに丸見え、クライアントの端末性能によっては表示がもたつくなど、問題が多い。

このようにカスタムテンプレートタグは万能ではないので、むやみにカスタムテンプレートタグを実装させることは避けるべきである。

(埋め込み型)カスタムテンプレートタグ・フィルタの利点と欠点

利点

  • テンプレート側から何度でも呼び出しができる
  • 複数のビューから同じテンプレートを呼び出している場合、ビューの処理を省略できる
  • HTMLそのものを作ることができる

(埋め込み型)カスタムテンプレートタグ・フィルタの利点はHTMLを作ることができる点にあると言える。DTLのifforはクラス名等のHTMLの属性に対しても、分岐や繰り返しを行うことができるので、より柔軟な装飾を施すことができるだろう。

欠点

  • カスタムテンプレートタグ、フィルタを使った後は、サーバーサイドでは何もできない
  • 実装までのハードルが高い

複雑な計算や、後から必要になる処理などには対処できない。

さらに実装までの過程が長すぎる。カスタムテンプレートタグ用のスクリプトを作り、settings.pyにてスクリプトをINSTALLED_APPSに追加し、テンプレートでロード、実行したいテンプレートタグ(関数)を実行する必要がある。

views.pyによる事前処理の利点と欠点

利点

  • 後から処理が追加できる
  • 複雑な処理でも容易に対処できる
  • DB読み書きの処理を追加できる

ビューは基本的にサーバー側の処理を全面的に担当するコンポーネントであるため、処理の後にさらに処理を追加することは容易。もっとも、あまり複雑な処理を増やしすぎるとレスポンスの遅延が目立つ。その場合は別途常駐スクリプトやバッチ処理などに割り当てるなどすれば良いだろう。

ビューではモデルをimportすることでDBにアクセスできるので、処理後にDBアクセスなどが容易。一方、カスタムテンプレートタグのスクリプト上でもモデルをimportできなくもないが、コンポーネントの役割から考えるとそれは適切とは言い難い。カスタムテンプレートタグのスクリプトからのDBのアクセスは、あくまでも選択肢のひとつとして考慮する程度が望ましいと思われる。

欠点

  • ビューの見通しが悪くなる
  • 作れるのは値だけであり、HTMLそのものは作れない

大規模なウェブアプリ、ウェブサイトであればそれだけビュークラスは増えていく。そんな中、ビューの処理を増やしてしまうとその管理保守はさらに難しくなるだろう。最も、これに関してはビューを別ファイル化するなどの対策もある。

基本的にビュー側でHTMLを書いても、テンプレート側ではそれは文字列として扱われる。禁じ手であるsafeフィルタを使うのは愚の骨頂。そうでなくてもHTMLがテンプレートとビューで分散してしまう状況に至る。これは看過できない。

よって処理に応じてHTML等の描画を変えたいのであれば、素直にカスタムテンプレートタグや基本のDTLに任せるのが妥当である。

こういうとき、カスタムテンプレートタグ?それともビュー?

さらに違いをはっきりさせるため、実例を元にどちらを採用するべきか考える。

帳票データの小計の計算処理

小計値の計算をした後、後からまた絞り込みなどを行う場合、カスタムテンプレートタグでは間に合わない。よってビューで計算処理を行い、後から絞り込みなどを行う。

1000を1kなどに書き換える表記処理

何度も呼び出す可能性の高い表記の変更はカスタムテンプレートフィルタで対処できる

ハッシュタグのリンク化

#から始まる文字列をハッシュタグとしてリンクさせる場合、HTMLを作ることになるので、カスタムテンプレートタグで対処。

乱数などの生成

状況によって異なるが、ビューで処理をする場合が多そう。

複数のページで生成した乱数を表示させ、HTML上の編集を行いたいのであれば、カスタムテンプレートタグ。

ひとつのページで乱数を生成する場合、乱数を生成した後何かしたい(DBへアクセスするなど)場合は、ビュー。(例:カジノゲームで掛け金が変動する等のDBへアクセスする必要がある場合。)

結論

結論を言うと、

カスタムテンプレートタグは頻繁に使う表示、表記、見た目(HTML)関係を担当。ビューによる処理は計算やDBアクセス、複雑な処理を担当。

これでそれぞれの役割分担ができるだろう。もちろん、状況によって例外はある。必ずしもこうしなければならないということは無い。

常に開発効率や処理速度、保守の容易さ等を考慮して臨機応変に対処したいところだ。

スポンサーリンク

シェアボタン

Twitter LINEで送る Facebook はてなブログ