◎ 前言
西元 1999 年,PHP 正慢慢席捲全球,台灣也在當年七月出版第一本 PHP 與 MySQL 結合的書(紅色書皮),猶記得當時要開發動態網頁的朋友們,都是人人一本紅皮書。PHP 的出現使得動態網頁的開發變得更容易,由於門檻降低,開發難度降低,更多的人有機會接觸動態網頁的設計。
然而,有使用過 PHP + MySQL 的人大概都知道,雖然開發動態網頁的難度降低了,但是使用它仍然很傷腦筋,因為處理資料的進出是一件很瑣碎的事情。我們需要寫讀取資料所要下的 SQL 指令、取出資料時也有 SQL 指令、又驗證使用者輸入資料的合法性等,每一項都是很繁瑣,很容易出錯,常常要寫一個很簡單的功能就因為這些瑣碎的功夫而花上龐大的時間。
由於這幾年動態網站的需求大量增加,便有人開發出各種不同的 web frameworks,而這些 frameworks 的出現將會一改之前這些瑣碎的步驟!設計一個動態網頁只需要短短的程式碼,甚至是你完全不用操心 SQL 要下的指令,因為這些事情 framework 都幫你處理好了。當然,有了這些框架,以往對於動態網頁的思維也有所改變。以下就介紹其中一個 framework ,名為 Django(D不發音),它是一個以 Python 為語言的 Web framework ,當筆者第一次碰觸時,也被它神奇的力量所吸引著!
◎ Django
Django 是一個用 Python 所寫的高階網頁框架,它可以讓人快速的開發實用又乾淨的網頁。Django 原是兩年前因應某一個線上新聞網站的運作開發而成的,它的設計主要是為了能處理密集的新聞資料,以及讓網站開發者可以在最短的時間內看到網站開發的內容。Django 最重要就是可以讓你快速開發一個高效能及精緻的網站。
咱們來看一下 Django 主要的內容以及運作方式吧。Django 自己有內附一個 HTTP server,使用者從瀏覽器透過 HTTP server 來要求資料時,server 會對照 urls.py 來找到相對映的 Python 程式來處理。在處理的過程當中,通常我們會讀某一個 template 檔,而此時 Django 就會將 template 所需要的資料都處理過後,再做回應。這是一個較籠統的說法,但是有很多概念與之前我們使用 PHP + MySQL 開發網頁已經很不相同了,因此在下面依照各項不同點來做介紹。
◎ URL 概念的改變
以往我們的概念總是一個 URL 對應到一個檔案,如 https://localhost/test.htm ,那麼我們讀取的網頁毫無疑問的就是 test.htm。然而若是動態網頁,我們會發現其實這樣子的分類並不恰當,因為網頁其實可以用功能性來做區分。例如某一個通訊錄網頁,它其中一個頁面是人員名單,另外有好多個頁面是個人詳細的資料,此時我們就可以將他區分為兩塊,一個也許叫做 list,而另一個就是 detail。此時呈現網址的狀況就和我們以往的習慣不同,變為:
https://localhost/list/
https://localhost/detail/1/
https://localhost/detail/2/
https://localhost/detail/3/
https://localhost/detail/4/
而處理這些眾多網址的程式卻只有兩個,一個是 list 的處理程式,另外一個則是 detail 的處理程式,後面的 1、2、3、4 則成為 detail 這支程式的參數。
就因為網址的型態從檔案改為功能區分,因此我們會需要一個有效的方式來處理。在 Django 中,它是讀取一個名為 urls.py 的檔案,其中網址的部份使用「正規表示式 (Regular Expression)」 來做核對,若是某一部分 match 了,則使用某一支程式來處理這個 request。
◎ 資料不再是表單
若承接上文─以通訊錄為例,我們通常會建立一個 SQL 表單叫做 contacts,裡頭有很多欄位,諸如 name、email、phone、address 等。然而在 Django 中,它將這樣表單的概念直接轉為物件導向中的類別 (class)。我們會建立一個叫做 Contact 的 python 類別,而裡頭有很多成員 (members),就和表單的欄位一樣,有 name、email、phone、address 等。
class Contact(meta.Model):
id = meta.AutoField("ID", primary_key=True)
name = meta.CharField("Name", maxlength=30)
email = meta.EmailField()
phone = meta.CharField("Phone", maxlength=16)
address = meta.CharField("Address", maxlength=100)
最神奇的一個步驟在於,當你寫好這個 Python 類別,我們只消用 Django 所附的工具程式 (manage.py),即可將這個 Python 類別轉成 SQL 指令,包括建立、查詢、更新、新增資料等。而且可以依照不同的 SQL 而產出不同 SQL 語法 (如 MySQL、postgreSQL 等)。
$ python manage.py sql phonebook
CREATE TABLE `phonebook_contacts` (
`id` mediumint(9) UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
`name` varchar(30) NOT NULL,
`email` varchar(75) NOT NULL,
`phone` varchar(16) NOT NULL,
`address` varchar(100) NOT NULL
);
COMMIT;
◎ Template: 樣板
有別於原始的 PHP 寫法,Django 使用樣板來呈現網頁的內容。樣板大部分都是 HTML 的程式碼,只有資料的部份會用特殊的 Django template 格式來取代,當然還有一些控制的機制例如 for 迴圈、if else 判斷等。這樣一來,網頁設計的部份就和資料的處理分離,不論是資料處理或是網頁的部份,程式碼看起來都乾淨許多。
一個簡單的樣板會長的像這樣:
{% if object_list %}
姓名 | 電郵 | 電話 | 住址 |
{{ object.name }} | {{ object.email }} | {{ object.phone }} | {{ object.address }} |
No entries...
◎ 總結
依照上述的介紹,Django 主要就是先對照 url,找到適當程式後,進入該程式;接著處理完資料部份後,就將樣板叫出來,並把資料的部份放上去,接著回傳。大略來說 Django 的運作方式即是如此。當然它還其他功能這邊並沒有介紹,例如使用者輸入(表單)處理的部份,然而筆者也是剛接觸這個架構,還正在摸索當中。
我認為這是一套很棒的架構,但是由於他還正在演化當中,並且文件說明有些複雜,很難快速的找到答案,因此上手仍然需要一些時間。然而一旦上手後,我相信他會是一個非常強而有力的框架!
(編按:看完以後,對Django的強大功能躍躍欲試了嗎?敬請期待下期更詳盡的實作部分!)
評論