什么是 web 開發(fā)框架
上一節(jié)課,我們簡(jiǎn)單地認(rèn)識(shí)了下 Flask 和 Django 這兩個(gè) Web 開發(fā)框架。但是限于篇幅原因有一個(gè)很重要的概念 “什么是 Web 開發(fā)框架?” 并沒(méi)有在上節(jié)課講到。這節(jié)課我們就來(lái)學(xué)習(xí)下什么是 Web 開發(fā)框架。
1. web 開發(fā)的歷史
1.1 靜態(tài)內(nèi)容的網(wǎng)站
1989 年,TimBerner 提出了一種能讓遠(yuǎn)隔兩地的研究者們共享知識(shí)的設(shè)想。它的基本理念是:借助多文檔之間相互關(guān)聯(lián)形成的超文本(HyperText),連成可相互參閱的 WWW(World Wide Web)。
在互聯(lián)網(wǎng)早期,網(wǎng)站的內(nèi)容是靜態(tài)的,瀏覽相同地址的頁(yè)面返回的內(nèi)容不會(huì)發(fā)生變化。使用 HTML 語(yǔ)言描述網(wǎng)頁(yè)的內(nèi)容,例如,用 HTML 描述某個(gè)網(wǎng)站的首頁(yè)如下:
<html>
<body>
<p>今天的日期是 2020 年 1 月 1 日</p>
</body>
</html>
無(wú)論什么時(shí)候去訪問(wèn)這個(gè)網(wǎng)站,網(wǎng)頁(yè)總是顯示 “今天的日期是 2020 年 1 月 1 日”,如果用戶希望訪問(wèn)網(wǎng)頁(yè)的時(shí)候能夠?qū)崟r(shí)顯示今天的日期,就無(wú)法實(shí)現(xiàn)這樣的功能了。
由于網(wǎng)頁(yè)的內(nèi)容是不發(fā)生變化的,因此早期互聯(lián)網(wǎng)站只能用于共享靜態(tài)的文檔,無(wú)法實(shí)現(xiàn)復(fù)雜的應(yīng)用。
1.2 早期的動(dòng)態(tài)網(wǎng)站
后來(lái),互聯(lián)網(wǎng)得到了飛速的發(fā)展,人們不再滿足網(wǎng)頁(yè)只有靜態(tài)文本的形式,于是開發(fā)動(dòng)態(tài)網(wǎng)頁(yè)的技術(shù)就應(yīng)運(yùn)而生了,例如專用于開發(fā)動(dòng)態(tài)網(wǎng)頁(yè)的 PHP 編程語(yǔ)言。1995 年,Rasmus Lerdorf 發(fā)明了 PHP 編程語(yǔ)言。PHP 是在服務(wù)器端執(zhí)行腳本語(yǔ)言,它輸出 HTML 文本返回給瀏覽器。
使用 PHP 開發(fā)的網(wǎng)頁(yè),網(wǎng)頁(yè)內(nèi)容是運(yùn)行時(shí)刻動(dòng)態(tài)生成的。在上面的例子中,很容易實(shí)現(xiàn)實(shí)時(shí)顯示今天的日期的功能,PHP 腳本通過(guò)調(diào)用 date () 函數(shù)獲取當(dāng)前日期, 即可生成包含有當(dāng)前日期的 HTML 文件。
1.3 web 開發(fā)需要越來(lái)越多的編程
在互聯(lián)網(wǎng)早期,網(wǎng)站中的主要內(nèi)容由靜態(tài)頁(yè)面構(gòu)成,開發(fā)一個(gè)網(wǎng)站并不需要太多的編程工作,網(wǎng)站開發(fā)人員會(huì)編寫 HTML 文件即可,很多網(wǎng)站甚至于不需要程序員的參與。
隨著互聯(lián)網(wǎng)的發(fā)展,網(wǎng)站的功能越來(lái)越復(fù)雜,網(wǎng)站提供的功能日趨豐富,網(wǎng)站更像是一個(gè)本地應(yīng)用程序,而不是單純展示內(nèi)容的網(wǎng)頁(yè)。在這個(gè)時(shí)期,開發(fā) Web 需要編寫大量的程序,一個(gè)復(fù)雜的 Web 開發(fā)項(xiàng)目包含有數(shù)萬(wàn)行、甚至于數(shù)十萬(wàn)行的源代碼,也就是說(shuō),寫一個(gè)網(wǎng)站開始變得越來(lái)越 “麻煩”。
不僅是麻煩,而且網(wǎng)站開發(fā)需要進(jìn)行大量的重復(fù)性工作,比如說(shuō)網(wǎng)站 A 需要開發(fā)一個(gè)后臺(tái)管理系統(tǒng),網(wǎng)站 B 也需要后臺(tái)管理系統(tǒng)。后臺(tái)管理系統(tǒng)功能的實(shí)現(xiàn)邏輯又非常相似,我們開發(fā)兩個(gè)網(wǎng)站就要寫兩套后臺(tái)管理系統(tǒng)的代碼,極大地增加了程序員的工作量。
既然是這樣,我們?yōu)槭裁床荒馨丫W(wǎng)站開發(fā)中這些相似甚至一樣的功能抽離出來(lái),封裝在一起,等到需要的時(shí)候再調(diào)用呢?
那個(gè)時(shí)候的程序員非常有效率,說(shuō)干就干,他們把大量的相似性功能封裝起來(lái),等到需要使用的時(shí)候進(jìn)行調(diào)用,于是就慢慢地形成的 “框架” 的概念。
2. 什么是 Web 開發(fā)框架
其實(shí)框架這個(gè)詞并不是 Web 開發(fā)領(lǐng)域所首創(chuàng),他最早出現(xiàn)在軟件開發(fā)行業(yè)中,一開始 “框架” 是這樣被定義的:框架是一種提供了可重用的公共結(jié)構(gòu)的技術(shù),為構(gòu)建新的應(yīng)用程序提供了極大的便利。
例如:在桌面應(yīng)用程序開發(fā)的領(lǐng)域,微軟公司的 Visual Studio C++ 為應(yīng)用程序生成框架,基于 VC++ 應(yīng)用程序框架可以大大地提升桌面程序的開發(fā)效率。
而隨著 Web 開發(fā)項(xiàng)目的復(fù)雜度的日益提升,軟件開發(fā)中的框架技術(shù)被引入到 Web 開發(fā)領(lǐng)域。Web 開發(fā)框架是用于進(jìn)行 Web 開發(fā)的一套軟件架構(gòu),Web 框架為 Web 應(yīng)用程序提供了基礎(chǔ)的功能。開發(fā)人員在 Web 框架的基礎(chǔ)上實(shí)現(xiàn)自己的業(yè)務(wù)邏輯,基于 Web 框架開發(fā)應(yīng)用,開發(fā)人員只需要專注應(yīng)用的業(yè)務(wù)邏輯,非業(yè)務(wù)邏輯的基礎(chǔ)功能則由框架提供,從而提升開發(fā)效率。
3. web 開發(fā)框架的主要作用
3.1 利用 web 開發(fā)框架簡(jiǎn)化應(yīng)用開發(fā)
Web 框架的主要作用是減輕 Web 應(yīng)用開發(fā)的工作量。使用 Web 框架進(jìn)行 Web 開發(fā)的時(shí)候,在進(jìn)行路由分發(fā)、頁(yè)面模板、數(shù)據(jù)緩存、數(shù)據(jù)庫(kù)訪問(wèn)等方面,不需要自己再重新實(shí)現(xiàn),而是將業(yè)務(wù)邏輯相關(guān)的代碼寫入框架就可以。
下面通過(guò)一個(gè)具體的例子說(shuō)明,Web 框架是如何減輕 Web 應(yīng)用開發(fā)的工作量。
3.2 論壇系統(tǒng)概述
一個(gè)論壇系統(tǒng)由如下數(shù)據(jù)構(gòu)成:
- 主題,每個(gè)主題包含有標(biāo)題和內(nèi)容,使用 topicID 標(biāo)識(shí)該主題;
- 用戶,每個(gè)用戶包含姓名和密碼,使用 userID 標(biāo)識(shí)該用戶。
假設(shè)論壇的域名是 www.bbs.com
,它向外界提供了若干可訪問(wèn)的 URL:
URL | 功能 |
---|---|
http://www.bbs.com/topics/12373 | 訪問(wèn) topicID 為 12373 的主題 |
http://www.bbs.com/users/1353 | 訪問(wèn) userID 為 1353 的用戶頁(yè)面 |
3.3 處理頁(yè)面的函數(shù)
在服務(wù)器端有兩個(gè)處理頁(yè)面函數(shù):
函數(shù) showTopic(topicID):
- 處理形式為 /topics/xxx 的頁(yè)面請(qǐng)求,xxx 為 topicID;
- 根據(jù) topicID 返回對(duì)應(yīng)的 topic 的內(nèi)容;
函數(shù) showUser(userID) :
- 處理形式為 /users/xxx 的頁(yè)面請(qǐng)求,xxx 為 userID;
- 根據(jù) userID 返回對(duì)應(yīng)的 user 的內(nèi)容。
3.4 服務(wù)端處理流程
假設(shè)瀏覽器訪問(wèn) URL http://www.bbs.com/topics/12373
,處理的邏輯如下圖所示:
-
服務(wù)端收到
/topics/12373
的頁(yè)面請(qǐng)求; -
查詢合適的函數(shù)處理路徑為
/topics/12373
的頁(yè)面;- showTopic 處理形式為
/topics/xxx
的頁(yè)面請(qǐng)求; - showUser 處理形式為
/users/xxx
的頁(yè)面請(qǐng)求; - 因此選擇 showTopic 來(lái)處理此次頁(yè)面請(qǐng)求。
- showTopic 處理形式為
-
將頁(yè)面路徑拆分為
/topics
和12373
,把12373
作為topicID
; -
將
topicID
傳遞給showTopic
,執(zhí)行該函數(shù)。
對(duì)每一個(gè)頁(yè)面處理請(qǐng)求都需要進(jìn)行如上的 4 步處理,在這 4 個(gè)步驟中,只有第 4 步才是應(yīng)用關(guān)心的業(yè)務(wù)邏輯。如果基于 Web 框架開發(fā) Web 應(yīng)用,Web 框架完成第 1 步、第 2 步、第 3 步的工作,應(yīng)用程序完成第 4 步的工作。即應(yīng)用程序只需要編寫具體處理頁(yè)面的函數(shù),其余繁瑣的、與業(yè)務(wù)無(wú)關(guān)的工作交給 Web 框架,因此使用 Web 框架可以大大地減輕開發(fā)的工作量。
4. 小結(jié)
本節(jié)課講解了 Web 開發(fā)框架的概念,使用思維導(dǎo)圖描述如下:
引入 Web 開發(fā)框架的目的:讓開發(fā)人員只需要專注應(yīng)用的業(yè)務(wù)邏輯,非業(yè)務(wù)邏輯的基礎(chǔ)功能則由框架提供,從而提升開發(fā)效率。通過(guò)一個(gè)具體的例子,演示了 Web 開發(fā)框架處理請(qǐng)求的步驟。