こんにちは。sinyです。
この記事ではDjagnoのクラスベースビューの挙動について基本的な処理フローを調べた際の情報をまとめました。
関数ベースビューとクラスベースビューの違い
Djangoのビュー実装するには関数ベースビュー(Function-based-view)とクラスベースビュー(Class-Based-view)の2つの実装方法があります。
超簡単に違いをまとめると以下の通りです。
実装方法 | 実装手順 |
---|---|
関数ベースビュー | pythonの関数(def)を使ってビューを実装する。 |
クラスベースビュー | pythonのクラス(class)を使ってビューを実装する。 |
どちらの方法をとるかは個人次第ですが、以下のようなメリット、デメリットが挙げられると思います。
ビューの実装方法 | Class-Based-view | Function-based-view |
---|---|---|
メリット | 少ないコードで実装できる。 誰が実装しても同じようなコードになる |
自分がわかりやすいスタイルでコードを実装できる。 |
デメリット | 実装の中身が理解しづらい。 クラスベースビューが提供していない機能を実現するのが難しい。 |
クラスベースビューに比べると実装に時間がかかる。 人によって実装方法が変わる。 |
どちらの方法をとらなければならないというルールはないので個人の好みにはなってしまいますが、クラスベースビューが提供している標準機能で事足りるのであればクラスベースビューを使うのが良いかと思います。
少し古い書籍ですがtwo-scoops-of-djangoという洋書にFunction-based-viewとClass-Based-viewどちらを選択すべきかに関する考え方が記載されていますのでご紹介します。
クラスベースビューの選択
Djangoには用途別に様々なクラスベースビュー(汎用クラスビュ)が用意されています。
なお、Djangoが提供する汎用クラスビューの情報については以下のサイトで公開されています。
非常に参考になるサイトですので、必ずブックマークしておきましょう!
非常に多くのクラスベースビューが存在していますが、最初は以下の5つを押さえておけば十分だと思います。
汎用クラスビュー名 | 用途 |
---|---|
TemplateView | 基本となる汎用クラスビュー |
ListView | データの一覧表示 |
CreateView | データの新規登録 |
UpdateView | データの変更 |
DeleteView | データの削除 |
各汎用クラスビューと属性(Attributes)とメソッド(method)の関係性がまとまった情報が存在していないため、個人的にこれらの情報をまとめたマトリックス表を作成しましたので、以下のリンク情報も参考にして頂ければと思います。
クラスベースビューを使う場合の処理フロー
たとえば、TemplateViewクラスビューを使って以下のようにクラス内にprint関数でメッセージを表示させようとしても、このprint関数は実行されません。
class IndexView(TemplateView): print("IndexViewを使ってTOP画面を表示します!") ⇒この行は実行されない。 template_name = 'blog/index.html'
なお、urls.pyには以下の設定がされているものとして解説します。
from django.urls import path from .views import index, IndexView urlpatterns = [ path('index_class', IndexView.as_view(), name="index_class"), ]
上記IndexViewを使ったURLへアクセスする場合、TemplateViewクラスベースビューを使った場合は以下のような流れで処理が実行されます。
- .URLへアクセスする。
- urls.py内を検索してindex_classにマッチしているURLパターンがないかチェックする。
- urls.py内にマッチするURLパターンが見つかると、対応するクラスビューを実行するためにIndexView.as_view()が実行される。
- IndexViewクラスに対して.as_view() メソッドが実行されると、内部処理でTemplateViewが持っているgetメソッドが呼ばれる。
- getメソッド内でビューに関する情報が取得されレスポンスを返す。
(ここでtemplate_nameの情報が取得される。)
「IndexView.as_view()メソッド実行⇒TempateViewのgetメソッド⇒画面表示」という流れをもう少し詳細に書くと以下のようなながれになります。
- URLアクセスするとurls.py内のURLパターンを検索する。
- IndexView.as_view()メソッドが実行される。
- as_view()メソッド内部でdispatchメソッドが実行される。
※dispatch メソッド は リクエストメソッドの種類(get,post等)を判定して、そのリクエストメソッドと同じ名前のメソッドを実行するといった処理を行っている。
※今回のケースではGETメソッドなので、TemplateViewクラス内でオーバーライドしたgetメソッドが実行されます。 - getメソッドが実行されると、View関連の情報(template_nameを含む)が取得されレスポンスが返される。
- 最終的に画面が表示される。
以上、Djangoのクラスベースニューの基本情報まとめでした。