DjangoにおけるViewクラスの使い分けについて|気ままにDjango #1

f:id:lib-arts:20190105175431p:plain

諸事情あり久しぶりにDjangoの勉強会に出たのですが、色々と質問いただくうちにいくつか改めて調べたので、ブログにもまとめておきたいと思います。

上記の記事でも軽くDjangoについて触れているので、こちらも参考にしていただけたらと思います。

進行については最近シリーズもの多くて各回の繋がりやシリーズを通しての構成を気にするのが面倒なので、オムニバス的な感じで気が向いたものを書いていければと思います。今回はDjangoにおけるViewクラスの使い分けと大元の実装などについてまとめます。

以下目次になります。

1. DjangoのViewについて

2. DjangoのViewクラスの使い分けに関して

3. DjangoのViewクラスの大元の実装に関して

4. まとめ

 

1. DjangoのViewについて

f:id:lib-arts:20190317174009p:plain

上記は『Django documentation | Django documentation | Django』の記述です。*1ここでのキーワードはrequestとresponseです。WebサーバはHTTPSの規格に基づいてユーザからのリクエストをさばいてレスポンスを返すということを知っていれば、処理を振り分ける役割を果たしているということがわかります。ちなみにRailsなどのMVCのシステムではここの役割がControllerですが、DjangoにおいてはViewがControllerで紛らわしいので注意が必要です。

とにかくリクエスト(request)を受けとってレスポンス(response)を返すと認識しておくと良いかと思います。

 

2. DjangoのViewクラスの使い分けに関して

f:id:lib-arts:20190317201510p:plain

上記は『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.)を参照します。

f:id:lib-arts:20190317204951p:plain

ソースを読むにあたっては 『Class-based views | Django documentation | Django』の記事のサンプルを起点にインポート元を確認できればと思います。上記はTemplateViewの記述ですが、これを読むことで、「PJ_root/django/views/generic/」下の__init__.pyから辿れば元実装が読めることがわかります。

f:id:lib-arts:20190317205648p:plain

実際にGitHubの上記のページが『django/django/views/generic at master · django/django · GitHub』 で確認できます。この__init__.pyにViewクラスの実装先が明記されていると推測できます。ここで、ファイルの名前を見た感じだと、おそらくbase.pyにベースのViewクラスを始めとする基本的なクラスが載っており、以外のファイルで拡張的な発展機能が実装されているのではと思われます。なんとなく概要を推測したところで実際にコードを見ていきましょう。

f:id:lib-arts:20190317210430p:plain

上記が__init__.pyの中身です。『django/__init__.py at master · django/django · GitHub』ここで、実際にインポートについて書かれています。これを見た感じだと、2節のドキュメントで書かれていたViewクラス、TemplateViewクラス、RedirectViewクラスの三つのクラスが「PJ_root/django/views/generic/base.py」に実装されていることがわかります。これを受けてbase.pyの中身を見てみます。

f:id:lib-arts:20190317211238p:plain

上記がViewクラスの書き出しです。『django/base.py at master · django/django · GitHub』からキャプチャを取っています。

f:id:lib-arts:20190317211428p:plain

同じファイル内にTemplateViewやRedirectViewがあり、これらはViewクラスの実装を拡張していることがわかります。

どのViewを使い分けるかという話においては、実際にコードを読むことで用途に合わせてベースを拡張するかすでに拡張されているものを選べば良いのではと思われました。

 

4. まとめ

やはりライブラリの実装を読むのは非常に面白いです。全部読まないで設計を参考にするだけでも、ファイルの名付けなどが非常に参考になります。

 

*1:日本語ドキュメントもあるのですが、なんとなく気分的に英語の方見ました。なんとなく知ってる人内容を見るにあたって変化が欲しかっただけで、実際に情報見る際は日本語のドキュメントで問題ないと思います。