DjangoにおけるViewクラスの使い分けについて|気ままにDjango #1
諸事情あり久しぶりにDjangoの勉強会に出たのですが、色々と質問いただくうちにいくつか改めて調べたので、ブログにもまとめておきたいと思います。
上記の記事でも軽くDjangoについて触れているので、こちらも参考にしていただけたらと思います。
進行については最近シリーズもの多くて各回の繋がりやシリーズを通しての構成を気にするのが面倒なので、オムニバス的な感じで気が向いたものを書いていければと思います。今回はDjangoにおけるViewクラスの使い分けと大元の実装などについてまとめます。
以下目次になります。
1. DjangoのViewについて
2. DjangoのViewクラスの使い分けに関して
3. DjangoのViewクラスの大元の実装に関して
4. まとめ
1. DjangoのViewについて
上記は『Django documentation | Django documentation | Django』の記述です。*1ここでのキーワードはrequestとresponseです。WebサーバはHTTPSの規格に基づいてユーザからのリクエストをさばいてレスポンスを返すということを知っていれば、処理を振り分ける役割を果たしているということがわかります。ちなみにRailsなどのMVCのシステムではここの役割がControllerですが、DjangoにおいてはViewがControllerで紛らわしいので注意が必要です。
とにかくリクエスト(request)を受けとってレスポンス(response)を返すと認識しておくと良いかと思います。
2. DjangoのViewクラスの使い分けに関して
上記は『Class-based views | Django documentation | Django』の記述です。この記述によると、全てのViewはViewクラスの継承によって作られているとされています。このベースのViewクラスはURLやHTTPのメソッドを取り扱っているようです。
拡張例として、RedirectViewとTemplateViewに触れられており、RedirectViewはシンプルなHTTPのリダイレクト目的で、TemplateViewはテンプレートのrenderを行うためにベースのViewクラスを拡張したものと言及されています。
その他のViewもあるようですが、同様にベースのViewクラスの継承で作られているようです。
3. DjangoのViewクラスの大元の実装に関して
継承関係について確認するにあたって、Djangoのリポジトリ(GitHub - django/django: The Web framework for perfectionists with deadlines.)を参照します。
ソースを読むにあたっては 『Class-based views | Django documentation | Django』の記事のサンプルを起点にインポート元を確認できればと思います。上記はTemplateViewの記述ですが、これを読むことで、「PJ_root/django/views/generic/」下の__init__.pyから辿れば元実装が読めることがわかります。
実際にGitHubの上記のページが『django/django/views/generic at master · django/django · GitHub』 で確認できます。この__init__.pyにViewクラスの実装先が明記されていると推測できます。ここで、ファイルの名前を見た感じだと、おそらくbase.pyにベースのViewクラスを始めとする基本的なクラスが載っており、以外のファイルで拡張的な発展機能が実装されているのではと思われます。なんとなく概要を推測したところで実際にコードを見ていきましょう。
上記が__init__.pyの中身です。『django/__init__.py at master · django/django · GitHub』ここで、実際にインポートについて書かれています。これを見た感じだと、2節のドキュメントで書かれていたViewクラス、TemplateViewクラス、RedirectViewクラスの三つのクラスが「PJ_root/django/views/generic/base.py」に実装されていることがわかります。これを受けてbase.pyの中身を見てみます。
上記がViewクラスの書き出しです。『django/base.py at master · django/django · GitHub』からキャプチャを取っています。
同じファイル内にTemplateViewやRedirectViewがあり、これらはViewクラスの実装を拡張していることがわかります。
どのViewを使い分けるかという話においては、実際にコードを読むことで用途に合わせてベースを拡張するかすでに拡張されているものを選べば良いのではと思われました。
4. まとめ
やはりライブラリの実装を読むのは非常に面白いです。全部読まないで設計を参考にするだけでも、ファイルの名付けなどが非常に参考になります。
*1:日本語ドキュメントもあるのですが、なんとなく気分的に英語の方見ました。なんとなく知ってる人内容を見るにあたって変化が欲しかっただけで、実際に情報見る際は日本語のドキュメントで問題ないと思います。