【65日目】プログラミング学び日記_Python×Django
このnoteは、31歳未経験からエンジニアを目指して勉強していく記録を綴っているものです。現在はAdTechでカスタマーサクセスを担当しつつ、色んなチャンスに恵まれ、CS業務や子育てと並行しながらチャレンジしています。
これからプログラミングを始める方にとってのTipsやモチベアップに繋げられるように頑張りたいと思っています。
--------------------------------------------
前回からの続きで、昨日作成したTodo管理アプリの中身を深堀してみていきたいとと思います。
↓前回の記事はこちら
前回も触れましたが、DjangoでWebアプリを作成する際は以下の手順の繰り返しです。
・アプリ内のviews.pyでロジックを作成し、
・アプリ内のurls.pyでURLを設定する
・そのあとHTMLファイルを書く
今回はこのurls.pyで記載したas_view()メソッドについてまとめてみたいと思います。一部抜粋したコードが以下です。
urlpatterns = [
path("", TodoList.as_view(), name="list"),
path("detail/<int:pk>", TodoDetail.as_view(), name="detail"),
path("create/", TodoCreate.as_view(), name="create"),
path("update/<int:pk>", TodoUpdate.as_view(), name="update"),
path("delete/<int:pk>", TodoDelete.as_view(), name="delete"),
]
as_view()メソッドの役割を理解するには、以下の手順で基本を理解していく必要がありました。
Djangoで採用されている「MTVモデル」という設計思想について
MTVモデルにおけるviewとは?
「Class-Based Views」と「Function-Based Views」の違いは?
as_view()メソッドの役割は?
1.Djangoで採用されている「MTVモデル」という設計思想について
MTVとは以下の頭文字です。
・Model(データベースのデータ。models.pyに格納。)
・Template(各ページのデザイン。extendsやloadで使用。)
・View(どのページを表示させるかを決定する処理)
似た設計にRuby on Railsで採用されているMVCモデルというものもあります(Model, View, Controller)。
2.MTVモデルにおけるviewとは?
公式ドキュメントには以下のように記述されています。
つまりviewとして機能させるには、以下3つの条件を満たす必要があるようです。
・リクエストを受け取れること
・レスポンスを返すこと
・呼び出し可能であること
昨日作ったアプリでは「views.py」と「urls.py」を使ってこれを成り立たせていることになります。
3.「Class-Based Views」と「Function-Based Views」の違いは?
コードをクラスで書くか、関数で書くか、というくらいの違いです。ただ、クラスはDjangoが元々用意してくれている「viewクラス」が多くあり、それを継承して使うことを指しているように感じました。自分でクラスを定義して使っても良いとは思うのですが、それだと関数を定義して使うのと大きく変わらなくなってしまう気がしまして。
↓作成したTodo管理アプリも複数のviewクラスを使用しました。
from django.views.generic import ListView, DetailView, CreateView, UpdateView, DeleteView
viewクラスを継承して使うことで、処理を自ら定義する必要がなく、views.pyに書くコードの量を減らすことができます。
逆に、Function-Based Views、関数でコードを書く場合、リクエストで処理を変える場合はif文を使って多くの分岐を書かなければなりません。
そのような背景もあり、最近ではClass-Based Viewsが主流になっているようです。
4.as_view()メソッドの役割は?
as_view()はClass-Based Viewsにおいて使用されるメソッドです。
2で触れた通り、viewは以下の3条件を満たしている必要があります。
・リクエストを受け取れること
・レスポンスを返すこと
・呼び出し可能であること
as_view()メソッドは、このDjangoのビューの条件を満たす関数を生成する役割を持っています(極論、as_viewを使わなくとも上記3条件を満たせればOK、と言えます)。具体的には、dispatchというまた別のメソッドを呼び出していて、リクエストを判定してそれに応じたメソッドを実行する、ということをやっているようです。
ちなみにクラスではなく関数でviewを作る場合、リクエスト毎にどうレスポンスするか自分で定義するため、as_view()メソッドは不要です。
↓Class-Based Viewsの場合
#「views.py」より抜粋
class TodoList(ListView):
model = Todo
context_object_name = "tasks"
#「urls.py」より抜粋
urlpatterns = [
path("", TodoList.as_view(), name="list"),
]
↓Function-Based Viewsの場合
#「views.py」より抜粋
def index(request):
return HttpResponse("<h1>Hello World</h>")
#「urls.py」より抜粋
urlpatterns = [
path("", views.index, name="index"),
as_view()はクラスを使った場合にのみ使用されていることが分かります。
引き続きこんな感じで、少しずつ丁寧に読み解いていこうと思います…!
出典
これまで修了したコース等
【YouTube動画】
Pythonでウェブサービスを作ろう! #1
テンプレートをマスターしよう! #2
静的ファイルを配信しよう !#3
データベースと接続しよう! #5
【Paiza】
Aランクレベルアップメニュー 24/49問
ループメニュー1 20/20問
ループメニュー2 5/20問
配列メニュー 31/64問
条件分岐メニュー 25/25問
二重ループメニュー 19/19問
配列活用メニュー 26/26問
文字列処理メニュー 30/30問
Bランクレベルアップメニュー 62/62問
Cランクレベルアップメニュー 30/30問
ランクB合格
ランクC合格
【書籍/ブログ】
Django入門 | 初心者でも1時間でWebアプリ(Todoアプリ)を作成するコース
基礎からのMySQL 514/514頁
Web技術の基本 189/189頁 ※2周目中
京大のPython教科書 116/201頁
Pythonデータベースプログラミング 194/194頁
Pythonエンジニアファーストブック読了
【Progate】
Python Ⅰ~Ⅴ
Python アプリ版 コースⅠ~Ⅴ
SQL Ⅰ~ Ⅳ
SQL アプリ版 コースⅢ
HTML&CSS 初級編
【その他】
VSCodeの環境構築
Anacondaの環境構築
MySQLの環境構築
この記事が気に入ったらサポートをしてみませんか?