はじめに
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入門②(ファイルの説明とシンプルな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サイト>
コード作成の前に、データの流れを再確認しておきます。
- ユーザが、ブラウザからWebページにアクセスする
- Webサーバが、urls.pyにhttpリクエストオブジェクトを転送する
- urls.pyはHTTPリクエストオブジェクトのURLとurlpatternsを比較する
urls.pyはurlpatterns内で合致したviewを呼び出す
※viewはviews.pyで定義する - 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サイトを表示できます。
コメント