[Python] Django 筆記
什麼是 Django?
一個基於python建立的Web框架(Framework),幫你把大部分的程式架構都建構好,開發者可基於這個骨幹結構做開發應用,加強程式開發速度、重用性和程式的可讀性。相較於傳統的MVC(Model-View-Contorller)架構,Django也有屬於它的MTV(Model-Template-Views)架構。
Django的運作的架構及流程
架構
Django架構主要分為下面四個部分
- Django本體:主要提供路由的功能
- Model: 與資料溝通
- View: 處理請求,進行資料計算,並決定顯示template資料內容
- Template: 資料呈現,主要檔案是放靜態頁面,通常是html文件
- Cache: 保存擷取過的網頁資料,加速瀏覽速度
MTV與一般看到的MVC架構稍微不同的點在於Template主要放純靜態網頁的資料。
流程
接著來看Django的運作流程
假設有用戶要訪問Django架設的頁面,會在瀏覽器上輸入網址,瀏覽器在得到網址之後,會經過路由,如果路由發現這個網頁的內容使用者已經有,快取(Cache)模組就會返還之前擷取過的資料,加速瀏覽速度;若沒有,則會去找Template要網頁資料,Template回傳基本的html網頁之後,Template顯示的內容一部分的資料需透過View去決定,有些內容可能需要從資料撈取的話,會透過Model向資料庫溝通。
Hands on Lab
使用Pipenv在虛擬環境中安裝django
1 |
|
建立Django專案
專案名稱為stocks
1 |
|
資料夾結構
Django的Management commands
manage.py
為Django提供的命令列工具,提供許多不同功能的指令。
啟動Django伺服器
切換stocks資料夾下
1 |
|
打開瀏覽器輸入 http://127.0.0.1:8000/
或是 http://localhost:8000/
,會看到django專案已成功在 web server 上執行。
若想了解有哪些指令可用,輸入 help
或-h
指令會列出所有指令列表:
1 |
|
上圖可以看到紅色錯誤訊息,我們需要對資料庫做同步。
1 |
|
指令會根據你對 Model 的修改刪除建立一個新的 migration 檔案,讓 migrate 指令執行時,可以照著這份紀錄更新資料庫。Model說明文件
Admin
大部份網站都設計有管理後台,讓管理者方便新增或異動網站內容。
而這樣的管理後台,Django 也有內建一個 App – Django Admin 。只需要稍微設定,網站就能擁有管理後台功能。
建立一個管理員帳號(superuser)
1 |
|
接著將帳號密碼等設定完成後重啟一次Django,輸入剛設定的管理員(superuser)即可登入
建立 Django application(app)
每一個 Django project 裡面可以有多個 Django apps。實作時,通常會依功能分成不同 app,方便管理及重複使用。
以quotes為app的名稱為例:
1 |
|
此時的檔案目錄結構多一個quotes專案(app)資料夾
但若要讓 Django 知道要管理哪些 apps,還需再調整設定檔。
作法: 打開 stocks/settings.py
,找到 INSTALLED_APPS
注意 app 之間有時候需要特定先後順序,盡量將自訂的apps加在最後面
在quotes專案資料夾下創建一個名為url.py的檔案。
假如一個project中有多個app,用以上的方式來管理url可能會造成比較混亂的局面,為了解決這個問題,我們可以用include的方法來配置url
1 |
|
Django 的 MTV 架構處理 request 的流程:
- 瀏覽器送出 HTTP request
- Django依URL配置分配至對應的View
- View進行資料庫的操作或其他運算,並回傳HttpResponse物件
- 瀏覽器依據 HTTP response 顯示網頁畫面
Django的MTV架構
View
用 render 這個 function 產生要回傳的 HttpResponse 物件
建立一個function用於處理 HttpRequest 物件,並回傳 HttpResponse 物件,下圖範例是在quotes資料夾下的views.py
檔
從網頁接收到 request 後,會將 request 中的資訊封裝產生一個 HttpRequest 物件,並當成第一個參數,傳入對應的 view function。HttpResponse 物件官方說明
上面可以看到當about(requset)
被呼叫時,回傳一個名為about.html的網頁名稱。
URL 設定
在quotes資料夾下建立一個新資料夾做templates,templates資料夾下新增about.html
檔,現在要對about這個網頁做路徑對應的配置,通常會定義在urls.py
檔,所以在quotes資料夾下創建urls.py
,建立URL 與 view 的對應關係,稱作URL conf (URL configuration)
範例:
1 |
|
從views.py
將定義好的function 做import。
再到stocks資料夾下的urls.py
做配置,先import include
,加入quotes.urls
,連結quotes的url配置,方便進行管理。
Template
Template可以幫助我們將前端頁面存放的一個獨立資料夾,一來不會全部丟在view內,二來如果未來也比較好與做前端頁面的人合作,對方只需要將寫好的頁面放置在template下即可。
打開資料夾settings.py
,搜尋TEMPLATES
,便能夠看到以上設定。
Django 預設會去找 TEMPLATES 的設定,DIRS
是讓Django額外搜尋TEMPLATES的目錄settings.py
內搜尋BASE_DIR
,透過BASE_DIR
設定,可以了解預設的專案的路徑。
Model
Django預設使用後端的資料庫系統為SQLite,可以在settings.py
檔案下搜尋DATABASES
,Django已先做好設置。
說明:
- ENGINE – 要使用的資料庫引擎。例如:
MySQL: django.db.backends.mysql
SQLite3: django.db.backends.sqlite3
PostgreSQL: django.db.backends.postgresql_psycopg2 - NAME – 資料庫名稱
若使用MySQL或PostgreSQL等其他資料庫,還需另外設定它的位置、名稱、使用者。
Model的幾個重點:
- 負責資料層、操作Database
- 基於ORM,且用Class 定義資料格式,建立資料欄位。
- Model Fields 可為 Django Model 定義不同型態資料屬性,紀錄幾個比較常用的:
CharField — 字串欄位,適合像 title、location 這種有長度限制的字串。
TextField — 合放大量文字的欄位
URLField — URL 設計的欄位
DateTimeField — 日期與時間的欄位,使用時會轉成Python datetime 型別。
步驟
- 到model.py檔內建立名為Stock的物件,Django會依據這個建立資料表,以及資料表裡的欄位設定。
1
2
3
4
5class Stock(models.Model):
# CharField: 定義資料格式為字串
ticker = models.CharField(max_length=10)
def __str__(self):
return self.ticker - 接著執行
python manage.py makemigrations
,makemigrations會告訴 Django,Model有所變動,這會建立一個遷移(migration)檔案。 - 對Model進行註冊,需要在讓Django知道,有哪些Model需要管理後台。
資料庫同步,完成遷移。
1 |
|
執行上述指令即可完成遷移。