djangoで作るTodo管理アプリ③(Function Based ViewとClass Based Viewの説明)

django

はじめに

djangoの基本動作は、HTTPリクエストオブジェクトを受け取りHTTPレスポンスオブジェクトを返す、となります。HTTPレスポンスオブジェクトを返す④を行うときにfunction based viewあるいはclass based viewを使用します。

今回は、function based viewとclass based viewの違いを整理しました。
整理した内容は下記となります。

  • 「function based view」と「class based view」の比較
  • 「function based view」と「class based view」の使い分け
  • 「function based view」と「class based view」でシンプルなWebサイトを表示

環境の準備

環境の構築方法は下記を順に参照して構築しておいてください。

django入門①(djangoの基本と環境構築)

django入門②(ファイルの説明とシンプルなWebサイトの表示)

「function based view」と「class based view」の比較

各viewの実装方法、メリット、デメリットについて表にまとめました。

function based view class based view
実装方法 関数 クラス
メリット
  • シンプルでわかりやすいため、初学者でも簡単に実装できる。
  • 処理の流れが明確で、デバッグがしやすい。
  • 機能が豊富で、複雑な処理にも対応できる。
  • 継承やオーバーライドなどの機能により、拡張性が高い。
デメリット
  • 機能が限定的であるため、複雑な処理を行うには不向きである。
  • 継承やオーバーライドなどの機能がないため、拡張性が低い。
  • 実装が複雑になる可能性がある。
  • 初学者には理解が難しい場合がある。

「function based view」と「class based view」の使い分け

function based viewとclass based viewの使い分けは、アプリケーションの規模や複雑さによって判断します。

  • シンプルなアプリケーションや、初学者が作成するアプリケーションでは、function based viewが適している。
  • 複雑なアプリケーションや、機能追加や拡張が想定されるアプリケーションでは、class based viewが適している。

ニュースサイトでviewの使い分けを解説

ニュースサイトを例に挙げると、以下のような使い分けが考えられます。

  • ニュースサイトのトップページ
    最新のニュース記事を一覧表示するページ。このページは、シンプルなページであり、複雑な処理は必要ない。そのため、function based viewで実装するのが適している。
  • ニュース記事の詳細ページ
    特定のニュース記事の本文やコメントを表示するページ。このページでは、ニュース記事のIDをパラメータとして受け取り、そのニュース記事のデータを取得する必要がある。また、コメントの投稿や編集などの処理を行う場合もある。そのため、class based viewで実装するのが適している。

「function based view」と「class based view」でシンプルなWebサイトを表示

作成するシンプルなWebサイトは下記となります。

<function based viewのシンプルなWebサイト>

<class based viewのシンプルなWebサイト>

コード作成の前に、データの流れを再確認しておきます。

  1. ユーザが、ブラウザからWebページにアクセスする
  2. Webサーバが、urls.pyにhttpリクエストオブジェクトを転送する
  3. urls.pyはHTTPリクエストオブジェクトのURLとurlpatternsを比較する
    urls.pyはurlpatterns内で合致したviewを呼び出す
    ※viewはviews.pyで定義する
  4. view(views.py)はhttpレスポンスオブジェクトをWebサーバに返す

今回、編集するファイルは「urls.py」と「views.py」となります。

urls.pyの編集

todoprojectディレクトリ内のurls.pyを下記のように編集します。

from django.urls import path
from .views import todolistfunc, TodoListClass

urlpatterns = [
    path('todolistfunc/', todolistfunc),
    path('todolistclass/', TodoListClass.as_view())
]
  • 「http://127.0.0.1:8000/todolistfunc」にアクセスすると、urlpatternsの「todolistfunc」と合致するので、views.py内の「todolistfunc」にルーティングされる。
  • 「http://127.0.0.1:8000/todolistclass」にアクセスすると、urlpatternsの「TodoListClass」と合致するので、views.py内の「TodoListClass」にルーティングされる。
  • class based viewを呼び出すときは「as_view()」メソッドを指定する必要がある。
  • 「todolistfunc」と「TodoListClass」がviews.pyで定義されていることを示すために、2行目で記述している。

views.pyの編集

todoprojectディレクトリ内のviews.pyを下記のように編集します。

from django.http import HttpRequest, HttpResponse
from django.views import View

def todolistfunc(request):
    response_object = HttpResponse('This is todolistfunc')
    return response_object

class TodoListClass(View):
    def get(self, request):
        response_object = HttpResponse('This is TodoListClass')
        return response_object
  • django.http.HttpRequest クラスと django.http.HttpResponse クラスをインポートする。
  • django.views.View クラスをインポートする。クラスベースのビューを作成するために必要となる。
  • todolistfunc は、HTTPリクエストオブジェクトをrequestで受け取り、HTTPレスポンスオブジェクトを返すViewとして定義された関数。
  • TodoListClass は、django.views.View クラスを継承している。class based viewには、 get()、post()、put() などのHTTPメソッドを定義できる。
  • TodoListClass 内の get() 関数は、HTTP GETメソッドでアクセスされたときに呼び出され、HTTPレスポンスオブジェクトを返す。

Webサーバの起動

ターミナルで下記のコマンドを実行してWebサーバを起動します。

(venv)$ python3 manage.py runserver

Webブラウザで下記のURLに接続すると、function based viewとclass based viewで作成したシンプルなWebサイトを表示できます。

  • function based viewのシンプルなWebサイトのURL
    「http://127.0.0.1/todolistfunc」
  • class based viewのシンプルなWebサイトのURL
    「http://127.0.0.1/todolistclass」

コメント

タイトルとURLをコピーしました