2024 網頁x人因xDjango 實務課程 03 Django 後端 MTV 運作原理解析

更新於 發佈於 閱讀時間約 18 分鐘

前言

上次建好一個新的 Django 專案後,一定很多人對於那些突然冒出來的檔案感到疑惑:

urls 是幹嘛的?
我要在哪邊寫程式碼?
我要怎麼設置我的網頁?

今天即將像大家介紹各個檔案的用途,並且帶入上次上課所教授的前後端概念,這次將以 Django 的後端詳細運作,展示給各位。那廢話不多說,我們開始課程吧。

資料來源:DALL-E 生成

資料來源:DALL-E 生成

整理好你的思緒,深深吸一口氣,讓我們在 2024 這嶄新的一年當中,開始新的學習之旅吧。



Django 檔案介紹

資料來源:本人 VScode 截圖

資料來源:本人 VScode 截圖


那當我們創建新的專案和 app 後,我們會得到這些新的檔案,有一些檔案是程式碼裡面配置用的,我們不太需要去做更改或運用。


用紅色框框圈起來的是,我們在日後開發網站的過程中,會經常需要動到的檔案,接下來將介紹這些檔案的用途,以及我們可以做出怎樣的變動。




settings.py

這裡存放著各種此專案的設定,在這專案中的其他檔案,都會透過 settings.py 取得一些整個專案的設定內容。這邊來提幾個,我們比較常用到的:

  1. INSTALLED_APPS
INSTALLED_APPS = [    
'django.contrib.admin',   
'django.contrib.auth',   
'django.contrib.contenttypes',   
'django.contrib.sessions',   
'django.contrib.messages',   
'django.contrib.staticfiles',
'{這裡新增你的 app 名稱}',
]

這裡是存放所有,你想要新增的 APP 名稱,如果你透過 Python manage.py startapp {app 名稱} 去新增一個新的 APP 時,可別忘了在這裡新增這個名稱,好讓 Django 可以抓到這個 APP 喔。


  1. ALLOWED_HOSTS
ALLOWED_HOSTS = [
'*',
]

這裡是一份允許進入你的網頁的限制名單,如果沒出現在這份名單的 IP 位置,是無法使用你的網頁的。而像這邊我寫的是 '*' ,這代表允許所有人使用此網頁,使其變得完全公開。


  1. DEBUG
DEBUG = True

這個是關於是否開啟幫助你去 修程式碼 的輔助功能,開啟後所有錯誤的網頁,都會列出詳細錯誤的原因以及其程式碼,方便你進行修正。

但請注意!如果現在是公開的階段,請更改為 False 。原因是因為,不法人士很有可能透過這個輔助功能,去查看你的程式碼寫法,盜走你的商業機密,甚至是侵入網站。


  1. TIME_ZONE
TIME_ZONE = 'UTC'

這個設定是去選擇你的時區是哪一個,通常會去配合你預計要吸引的客群的所在時區。如果是台灣的話,通常會設定成 'Asia/Taipei' 台北的時區。


  1. LANGUAGE_CODE
LANGUAGE_CODE = 'en-us'

這是用於控制你的網頁的語言為何,通常一些設定的網頁內容,預設文字就會是你選擇的這個文字。目前屬於美式英文,但如果想要用中文的話,可以更改為'zh-TW'


tests.py

當你在進行開發網站之後,可以需要進行多種測試(單元測試),驗證你撰寫的程式碼是否完全正確。因此這個檔案就是專門用來給你測試用,減少在專案上的錯誤。

比方說:

# tests.py

from django.test import TestCase
from myapp.models import MyModel

class MyModelTestCase(TestCase):
def setUp(self):
# 在每個測試方法執行之前設置初始資料
self.my_model = MyModel.objects.create(name='Test', price=10.00, quantity=5)
def test_calculate_total(self):
# 測試 calculate_total() 方法是否正確計算總價格
expected_total = 10.00 * 5
self.assertEqual(self.my_model.calculate_total(), expected_total)

在這個測試的環節中,必須寫好幾個方法,根據你需要測試的內容,寫不同的方法讓它程式碼實際跑過看看。

寫好單元測試後,輸入 Python manage.py test 進行測試,若有出現任何問題也會在此跑出來。這樣的單元測試,更加方便的去審視開發者,可能在開發過程中遺漏的部分。


models.py

當我們在製作的網頁的過程,一定會遇到需要儲存資料的時候,比如說:

電商平台一定會有訂單的資料
學校會有學生與老師的資料
FB 會有各個貼文的資料

而這些資料,一旦多了起來,我們將難以去控管。因此,我們才需要資料庫去幫助我們,好好的儲存與使用這些資料。

models.py 就是用來設計與控管我們資料庫的內容,我們可以在裡面新增各種主題,比方說 貼文 好了。一個貼文可能會有這幾種要素:

  1. 大頭貼
  2. 名稱
  3. 時間
  4. 貼文內容
  5. 貼文的讚數
  6. 留言

以此為例,我們就可以寫在 models.py 裡面成這樣:

from django.db import models
from django.utils import timezone

class Post(models.Model):
# 定義大頭貼欄位,使用ImageField,需要安裝Pillow庫
avatar = models.ImageField(upload_to='avatars/')
# 定義名稱欄位,使用CharField
name = models.CharField(max_length=100)
# 定義時間欄位,使用DateTimeField
time = models.DateTimeField(default=timezone.now)
# 定義貼文內容欄位,使用TextField
content = models.TextField()
# 定義貼文的讚數欄位,使用IntegerField,預設值為0
likes = models.IntegerField(default=0)
# 定義留言欄位,這裡使用TextField僅作為示例,實際情況下可能需要另一個模型來更好地管理留言
comments = models.TextField(blank=True)

def __str__(self):
return self.name


當我們寫好一個新的資料庫的內容的時候,接著必須運行這兩個指令,去做更新:

python manage.py makemigrations
python ​manage.py migrate

至此,我們就擁有了一個方便管理貼文的資料庫了。


admin.py

當我們在確定已經透過 python manage.py runserver ,執行 django 的時候,我們可以嘗試進入 127.0.0.1:8000/admin 進行一個網頁總管,在裡面可以管理我們的資料庫、使用者等等......

admin.py 則是可以在裡面設計 admin 這個管理頁面,出現資料庫的畫面與編排,這些將在後續課程進行更詳細的介紹。


templates

我們在開發網站的過程中,必定會有需要寫網頁的需求嘛,那這些設計好的網頁會存放在哪呢?就是放在我們的 templates 資料夾。

這時候可能有人在想,我沒有看到這個資料夾啊!

沒錯,templates 需要我們主動去建立這個資料夾,像這樣:

資料來源:本人 VScode 畫面

資料來源:本人 VScode 畫面


接著呢,我們還得去 settings.py 去設定,我們的網頁內容都是存放在這個資料夾裡面。請大家在 settings.py 中,尋找這樣的內容:

TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]


並且,在 'DIRS': [], 的中括號裡面新增這一串 os.path.join(BASE_DIR, 'templates').replace('\\', '/') 像是這樣:

TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates').replace('\\', '/')], #變化在這裡
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]


至此,我們就設定好了這個資料夾的連結。現在,我們可以將所有設計好的 html 給放在這個資料夾裡面。


views.py

在這個檔案中,我們將定義各種方法,大家可以想像成說,方法是一個我們呼叫了,就必定要得到一個東西。

換句話說,在這邊我們可以準備每個網址相對應的方法,讓各個網址可以得到應該要取得的網頁內容。

根據上一個 urls.py 介紹的範例程式,我們來寫一個在 views.py 相對應的內容:

from django.http import HttpResponse

def home(request):
# 使用render函數渲染index.html模板
return render(request, 'index.html')

def profile(request):
# 使用render函數渲染profile.html模板
return render(request, 'profile.html')

大家可以發現,在定義好的兩個方法中,我們取得了來自 templates 中的兩個 html ,回傳給使用者。


urls.py

不知道大家有沒有想過,為什麼我們可以輸入這麼多的網址,而且每個網址都能忠實的呈現他應該要對應的內容。

其實直覺上來說,就是我們去設定,怎樣的網址會對到怎樣子的網頁。比方說:

from django.urls import path
from . import views

urlpatterns = [
# 首頁​
path('', views.home, name='home'),
# 個人資料
path('profile/', views.profile, name='profile'),
]

在這個檔案中,我們定義了兩個網址:

127.0.0.1:8000 > 前往首頁
127.0.0.1:8000/profile/ > 前往個人資料

那至於應該要出現的內容,則是剛剛定義在 views.py 當中,我們剛寫好的兩個方法,分別是 home 跟 profile,因此這兩個方法,會回傳 home.htmlprofile.html 這兩個網頁給使用者,讓他們能夠看見 首頁 或是 個人資料。





總結

資料來源:Canva 自行繪製

資料來源:Canva 自行繪製


後端運作流程

回顧

首先,我們先來回顧一下上次課程內容。

資料來源:Canva 自行繪製

資料來源:Canva 自行繪製

在上次的課程中,我們知道了前後端的運作流程:

【使用者】

  • 有一位學生,輸入了學校首頁的網址,並且按了 enter 鍵。
  • 電腦發送 request 的網頁請求給網站伺服器

【後端】

  • 收到來自學生輸入的網址
  • 你的電腦後端辨別出這個網址對應到的是學校首頁。
  • 為這個首頁準備今天的焦點新聞
  • 跟資料庫要求本日的焦點新聞

【資料庫】

  • 找到所有的焦點新聞
  • 只取今天的焦點新聞
  • 把這些焦點新聞的內容傳給後端

【後端】

  • 收到今天的焦點新聞內容
  • 整理好後傳給前端的首頁

【前端】

  • 收到焦點新聞的內容
  • 處理好排版問題後,回傳完整內容的網頁給後端

【後端】

  • 收到應該要傳給使用者的完整網頁
  • 傳送完整網頁給使用者

【使用者】

  • 收到完整網頁的內容(此時為程式碼)
  • 瀏覽器將程式碼化為有圖有文的網頁
  • 使用者看見首頁內容


那接下來,我們將介紹後端的部分。


MTV 架構

首先, Django 採用的架構是 MTV 架構。那這個 MTV 又是甚麼呢?我們拆開來看看:

M : Models
T : Templates
V : Views

沒錯,大家有沒有發現,這三個都是剛剛講過的內容。

M : Models
>> 資料庫

T : Templates
>> 存放網頁(html)

V : Views
>> 存放方法


MTV 流程

那接下來,我們來介紹一下他的流程:

資料來源:Canva 自行繪製

資料來源:Canva 自行繪製

【Views】

  • 方法被觸發後
  • 向 Model 尋找應該要準備的資料

【Models】

  • 收到 Views 想找的資料類型
  • 準備資料
  • 回傳資料給 Views

【Views】

  • 收到 Models 回傳的資料
  • 處理資料
  • 再向 Models 尋找資料

【Models】

  • 收到 Views 想找的資料類型
  • 準備資料
  • 回傳資料給 Views

【Views】

  • 收到 Models 回傳的資料
  • 處理資料
  • 向 Templates 取得應該要回傳的網頁

【Templates】

  • 收到 Views 想尋找的網頁檔案名稱
  • 回傳給 Views 這個網頁

【Views】

  • 收到 Templates 回傳的網頁
  • 將這些資料塞進這個網頁當中
  • 將準備好的完整的網頁 回傳給使用者

流程大概是就是:

Views -> Models -> Views -> Templates -> Views -> User

在準備給 User之前呢,Views 有可能需要多種的資料,因此在那段過程中,有可能會不斷地向 Models 尋找資料,最後才向 Templates 取得網頁,將資料塞進裡面。


MTV 範例介紹

那我們來做個簡單的範例,假設今天我們寫的是一個貼文好了:

  1. 架構
我們先來思考第一件事情, 這個貼文應該包含什麼樣的要素?
1. 使用者名稱
2. 貼文內容
  1. 流程
資料來源:Canva 自行繪製

資料來源:Canva 自行繪製

【User】

  • 輸入 網址 想要瀏覽貼文

【Urls】

  • 收到 User網址
  • 找到在 Views 當中 這個網址相對應的方法
  • Views 呼叫 這個方法

【Views】

  • 啟用 這個方法
  • 準備 使用者名稱 的資料
  • Models 請求 使用者名稱

【Modles】

  • 收到 Views使用者名稱 的請求
  • 找到相對應的 使用者名稱
  • 回傳 使用者名稱Views

【Views】

  • 收到 Models 回傳的 使用者名稱
  • 處理這個 使用者名稱
  • 接著,準備 貼文內容
  • Models 請求 貼文內容

【Models】

  • 收到 Views貼文內容 的請求
  • 找到相對應的 貼文內容
  • 回傳 貼文內容Views

【Views】

  • 收到 Models 回傳的 貼文內容
  • 處理這個 貼文內容
  • Templates 請求 貼文的網頁模板

【Templates】

  • 收到了 Views貼文的網頁模板 的請求
  • 找到 貼文的網頁模板
  • 回傳 貼文的網頁模板Views

【Views】

  • 收到了 Templates 回傳的 貼文的網頁模板
  • 使用者名稱貼文內容 塞進去這個 貼文的網頁模板
  • 準備好了 完整的貼文網頁
  • 將這個 完整的貼文網頁 回傳給 User

【User】

  • 看見 完整的貼文網頁


那這就是 Django 的 MVT 後端框架的完整流程。


結語

感謝你看到這邊,把這些內容持之以恆地讀完肯定不容易,你辛苦啦!

今天我們學到了 Django 各個檔案的用途,也學到了 MTV 架構,更是學到了 MTV 架構的實際流程。

接下來,我們將實際的根據 MTV 架構,建立一個新的網頁。


留言
avatar-img
留言分享你的想法!
avatar-img
咖啡因學習教室
12會員
18內容數
這裡是來自 高科大 資管系二年級的學生,希望能在學習的過程中,也分享這些知識給大家。
咖啡因學習教室的其他內容
2024/03/14
前言 那麼今天要來教大家,如何實現各種排版,以及不同的 CSS 可以做出怎樣的效果。 整理好你的思緒,深深吸一口氣,讓我們在 2024 這嶄新的一年當中,開始新的學習之旅吧。 字體相關 color 設定文字的顏色。 <p style="color: blue;">這是藍色文字。</
2024/03/14
前言 那麼今天要來教大家,如何實現各種排版,以及不同的 CSS 可以做出怎樣的效果。 整理好你的思緒,深深吸一口氣,讓我們在 2024 這嶄新的一年當中,開始新的學習之旅吧。 字體相關 color 設定文字的顏色。 <p style="color: blue;">這是藍色文字。</
2024/03/14
前言 今天課程要來學習,在 .css 設計樣式後,怎麼透過選擇器,讓 .html 可以有所配對,經過這一步後,便可以開始學習,如何正式設計 .css 了。 選擇器 介紹 還記得上次課程,我們在 .css 檔案中,撰寫的程式碼嗎?讓我們來複習看看: .highlight { co
2024/03/14
前言 今天課程要來學習,在 .css 設計樣式後,怎麼透過選擇器,讓 .html 可以有所配對,經過這一步後,便可以開始學習,如何正式設計 .css 了。 選擇器 介紹 還記得上次課程,我們在 .css 檔案中,撰寫的程式碼嗎?讓我們來複習看看: .highlight { co
2024/03/14
前言 終於要到這個振奮人心的章節了,我們終於要來學習,如何讓自己的網頁更加美觀。 但在這之前,我們肯定得先學習,如何將我們的 CSS 檔案,連接到 HTML 當中。 連結分類 首先,我們在連結 CSS 的方法中,有分為三種: 內聯連結 在 .html 當中,任一標籤的裡面,用屬性 s
2024/03/14
前言 終於要到這個振奮人心的章節了,我們終於要來學習,如何讓自己的網頁更加美觀。 但在這之前,我們肯定得先學習,如何將我們的 CSS 檔案,連接到 HTML 當中。 連結分類 首先,我們在連結 CSS 的方法中,有分為三種: 內聯連結 在 .html 當中,任一標籤的裡面,用屬性 s
看更多
你可能也想看
Thumbnail
沙龍一直是創作與交流的重要空間,這次 vocus 全面改版了沙龍介面,就是為了讓好內容被好好看見! 你可以自由編排你的沙龍首頁版位,新版手機介面也讓每位訪客都能更快找到感興趣的內容、成為你的支持者。 改版完成後可以在社群媒體分享新版面,並標記 @vocus.official⁠ ♥️ ⁠
Thumbnail
沙龍一直是創作與交流的重要空間,這次 vocus 全面改版了沙龍介面,就是為了讓好內容被好好看見! 你可以自由編排你的沙龍首頁版位,新版手機介面也讓每位訪客都能更快找到感興趣的內容、成為你的支持者。 改版完成後可以在社群媒體分享新版面,並標記 @vocus.official⁠ ♥️ ⁠
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
※ 原本狀態:伺服器渲染 這是 MVC 架構下的 request / response 示意圖,在這張圖呈現的架構裡,畫面和資料都由同一個架構處理。 伺服器渲染流程: 瀏覽器針對特定網址送出請求。 路由器解析請求後,轉接給對應的 controller。 controller 按照要求,透過
Thumbnail
※ 原本狀態:伺服器渲染 這是 MVC 架構下的 request / response 示意圖,在這張圖呈現的架構裡,畫面和資料都由同一個架構處理。 伺服器渲染流程: 瀏覽器針對特定網址送出請求。 路由器解析請求後,轉接給對應的 controller。 controller 按照要求,透過
Thumbnail
※ 視圖模板 視圖模板(View Templates) 是在 MVC 架構中負責展示數據的 HTML 文件,包含模板語法,用於在渲染時插入實際數據。它們的主要目的是分離數據與展示邏輯,讓代碼更加模塊化和易於維護。 視圖模板設計和使用的核心理念,就是「重複的事情不要重複做、效益最大化、有效利用資源
Thumbnail
※ 視圖模板 視圖模板(View Templates) 是在 MVC 架構中負責展示數據的 HTML 文件,包含模板語法,用於在渲染時插入實際數據。它們的主要目的是分離數據與展示邏輯,讓代碼更加模塊化和易於維護。 視圖模板設計和使用的核心理念,就是「重複的事情不要重複做、效益最大化、有效利用資源
Thumbnail
在前一篇我們已經成功地建立簽核表單及簽核節點並關聯回請假表單,而本篇會接著介紹如何管理簽核節點狀態並同步更新簽核表單狀態。
Thumbnail
在前一篇我們已經成功地建立簽核表單及簽核節點並關聯回請假表單,而本篇會接著介紹如何管理簽核節點狀態並同步更新簽核表單狀態。
Thumbnail
本文介紹瞭如何在後端系統開發時設計不同表單的簽核流程,包括請假表單和採購表單。以及如何動態生成簽核表單,並建立簽核節點。另外還介紹瞭如何利用繼承來簡化簽核流程的設定。
Thumbnail
本文介紹瞭如何在後端系統開發時設計不同表單的簽核流程,包括請假表單和採購表單。以及如何動態生成簽核表單,並建立簽核節點。另外還介紹瞭如何利用繼承來簡化簽核流程的設定。
Thumbnail
你好,在下最近在學習開發web,學了html css js,也得出一些心得,由於網路上已有許多教學,所以我會著重在如何開發出to do List,以及解釋我寫的程式碼。相關的教學我會直接貼網址。如果我有什麼地方出錯,或者是可以寫得更好,歡迎在下方留言,討論。 首先先介紹我的開發環境: 我用了vs
Thumbnail
你好,在下最近在學習開發web,學了html css js,也得出一些心得,由於網路上已有許多教學,所以我會著重在如何開發出to do List,以及解釋我寫的程式碼。相關的教學我會直接貼網址。如果我有什麼地方出錯,或者是可以寫得更好,歡迎在下方留言,討論。 首先先介紹我的開發環境: 我用了vs
Thumbnail
你知道IG是用Django開發的嗎? 正在學習或使用Django、Flask框架開發後端的你,是否也常在享受Python語法的舒適之餘,仍然煩惱著是否該學習效率更好的GO或Laravel。
Thumbnail
你知道IG是用Django開發的嗎? 正在學習或使用Django、Flask框架開發後端的你,是否也常在享受Python語法的舒適之餘,仍然煩惱著是否該學習效率更好的GO或Laravel。
Thumbnail
本文章介紹了建立網頁的整個流程,包括設置 Templates, Views, Urls 等步驟。透過這些步驟,大家便能創建一個新的網頁,並成功測試。
Thumbnail
本文章介紹了建立網頁的整個流程,包括設置 Templates, Views, Urls 等步驟。透過這些步驟,大家便能創建一個新的網頁,並成功測試。
Thumbnail
本文介紹了 Django 專案中各個檔案的用途,包括 settings.py、tests.py、models.py 等。並且解釋了 MTV 架構的後端運作流程,以及相對應的範例介紹。閱讀本文可幫助讀者更好地瞭解 Django 後端開發。
Thumbnail
本文介紹了 Django 專案中各個檔案的用途,包括 settings.py、tests.py、models.py 等。並且解釋了 MTV 架構的後端運作流程,以及相對應的範例介紹。閱讀本文可幫助讀者更好地瞭解 Django 後端開發。
Thumbnail
當我剛開始接觸這個領域的時候,經常會看到有人在討論: 到底要做前端還是後端工程師呢?後端工程師賺的比前端工程師多?前端工程師轉後端工程師?那前端與後端到底是什麼呢? 這篇文章提供了前端與後端的基本概念並舉例來說明。同時也介紹了前端的三大要素以及後端的運作原理,對於想深入瞭解前後端的讀者會非常有幫助。
Thumbnail
當我剛開始接觸這個領域的時候,經常會看到有人在討論: 到底要做前端還是後端工程師呢?後端工程師賺的比前端工程師多?前端工程師轉後端工程師?那前端與後端到底是什麼呢? 這篇文章提供了前端與後端的基本概念並舉例來說明。同時也介紹了前端的三大要素以及後端的運作原理,對於想深入瞭解前後端的讀者會非常有幫助。
Thumbnail
本文將介紹如何從頭開始建立一個Django專案,包括安裝和設定,以及創建管理員帳戶和新的app。透過本文,你可以學習到建立自己的網頁的所有步驟和設定。
Thumbnail
本文將介紹如何從頭開始建立一個Django專案,包括安裝和設定,以及創建管理員帳戶和新的app。透過本文,你可以學習到建立自己的網頁的所有步驟和設定。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News