Django 網站實做紀錄
基本資料
框架|Django
資料庫 | PostgreSQL(production), SQLite(development)
部署服務|Heroku
Django 分成三個部分:Model, Template, View (MTV),其中 Model 負責處理資料庫與模型,Template 負責前端呈現,View 負責後端邏輯,以下分別簡介:
Model
這個專案的資料庫原本使用預設的 SQLite, 而在將應用程式部署到雲端時將 production 環境的資料庫改成 PostgreSQL,development 環境不變。 Django 使用 Object Relational Mapping (ORM) 技術,所以直接用 python 下指令就可以操作資料庫。在模型方面建了三張表,一張紀錄使用者(包含顧客與商家)、一張紀錄杯子、一張管理杯子物流。
View
前端請求與後端資料庫的中間人,乍看之下很像是流行的 MVC (Model, View, Controller) 架構中的 Controller 角色(對是 controller 不是 view 哦),但其實有細微的差異。差異在哪裡?Django 官網回答
In our interpretation of MVC, the “view” describes the data that gets presented to the user. It’s not necessarily how the data looks, but which data is presented.
他們(Django 的始作俑者們)認為 MVC 架構中 View 的角色處理的是資料的選取而不是資料的呈現方式。所以在他們設計的 MTV 架構中,View 是一個 url 的回呼程式(callback function)負責資料的選取。在我預計要寫的文章中有一篇是關於 MTV 架構與以 MVC 架構的比較。現在先講這樣。
Template
這就是 Django 設計負責「如何呈現」資料的部分,將從 View 傳過來的資料呈現出來,在 MVC 架構中的大致對應是 View。主要使用前端三劍客 html, css 與 Javascript。
Form
這是我覺得 Django 一個滿酷的設計,雖然不是 MTV 三元素之一,但還是特別來介紹一下。由於表單是網頁中一個很常被使用的元素,所以 Django 直接將 Form 寫成一些實用的類別,讓我們可以直接拿來用。Form 表單算是在 View 與 Template 中間,常見做法是另外開一個 forms.py 檔案或是 forms 資料夾,在裡面管理所有表格相關的邏輯。跟 forms 有關的 library 包含了像是 ModelForm,可以直接讓你用模型來創立表單,只要把 routing 設好 then you’re good to go.
Admin
Admin 是 Django 所謂「自帶電池」的特色之一:直接自帶一整個後台管理系統!只要在終端機先建立一個 superuser,就可以進入後台管理模型的實例(新增、修改等等)。另外一個特色就是如果你只要最簡單最快的網站,user 的模型也直接送給你(不過這種情形大概不多)。
操作實例
網站設計
寫一個網站最重要的就是設計結構了。當初開始做時也是邊摸邊調整,畢竟是第一次用 Django,有很多這個框架的特性還沒有摸熟,還不知道怎麼樣設計才能最大發揮這個框架的特長,所以前前後後其實改了滿多。以下紀錄最終版本。
模型
三張表:使用者、杯子、紀錄。
使用者包含商家與顧客,共享同一張資料表。本來研究了很久到底要不要把他們拆開,但是依照目前網站的需求,其實顧客與使用者的差異不大,所以就統一放在一張表。欄位主要是各種使用者基本資料與登入資料。
杯子主要有自己獨特的 ID。
紀錄表單紀錄了每一次杯子從借出到被還回去的資料,總共有借出店家、借出日期、借出人、還入店家與還入日期。
它們之間的關係是:
使用者擁有多個杯子與多個紀錄。
杯子屬於使用者、有很多紀錄。
紀錄屬於使用者與杯子。
在每次的表格更新時,都會同時更新這些表單的相關欄位。
後端發生的事
非~~~常簡略的版本是:當使用者發送 url,urls.py 會擔任路由角色把該網址轉給負責的 view (放在 views 資料夾中),可能是一個 function 或是 class。 view 根據需求處理資料(從 request 傳來的或是去操作資料庫(模型放在 models.py)),或是交給相應的 form(放在 forms 資料夾)處理,最後把要回傳的資料傳到 template (放在 template 資料夾),呈現給使用者。
自己學到的東西
- 設計資料庫模型的重要(還有自己多不會做這件事)
做這個網站時大概有一半的時間都在修模型,深深體會到模型好了剩下的都不是難事了啊。下學期要來找一門資料庫設計的課來修!
2. Rails 框架的特性
為什麼是 Rails 不是 Django 呢?因為其實我自己比較熟 Ruby 語言,唯一用過的框架是 Rails ,所以在寫Rails 的時候沒有實際從一個遠一點的角度來看 Rails 的機會,就算知道它的特性但是沒有比較標準也不會特別有感,直到 Django 的到來。概括來說,Django 雖然號稱自帶電池 (battery included),但是比起 Rails,它是輕巧靈活(但比較囉唆)的那一個。
Rails 注重的是 「Convention over configuration.」也就是說,你只要照著它設定好的那一套邏輯走,你與它就會走得輕鬆寫意又超快,因為很多環境設定它都自動幫你喬好了。但前提是,你要照著它的邏輯走。
Django 從架構本身就看得出來,一個 project 底下有好幾個 application,這個 project 可以隨時插拔每個 app,而每個 app 也都可以被拿去其他 project 重複使用。這就是現在漸趨主流的 microservice 概念?好處是元素重複使用率高,當部件越寫越多以後開發就會越來越快。
3. Javascript
雖然這個專案中我的角色不是前端(所以說網站中美麗的畫面都不是我的功勞),但大部分的 JS 是我寫的,也是一個邊學邊做現學現賣的過程,意外地發現其實很有趣!雖然現在還是寫地生疏又心虛,但我相信我們變熟的那一天指日可待。
4. Git/Github
雖然說平常在實習的時候、自己的專案都會用,但是這算是第一次帶一群人一起用,很多原本不求甚解的眉眉角角都到了這時候才不得不真的弄清楚,也算是一個收穫。
最後,網站在這裡。
文章同步發表於 Medium。