Knowledge
Table of Contents

CGI

Common Gateway Interface


網頁程式與伺服器的溝通介面

在 server side 執行的程式, 稱 CGI 程式

負責將網頁中的程式執行完之後把結果回傳給 server

古早垃圾 PHP + CGI

一堆缺點: 所有東西擠在一起, 維護難

 

WSGI

Web Server Gateway Interface

擷取自 化整為零的次世代網頁開發標準: WSGI


簡單的來說, 它是 Python 定義網頁程式和伺服器溝通的介面

它的作用基本上就是和 CGI 類似的功用, 定義一個標準的溝通方式

讓你寫的 Python 程式可以和伺服器溝通

透過環境變數來取得外部資訊, 繼承了自 CGI 的環境變數, 除此之外它還定義了一些額外的變數

Middleware 它讓我們不用改原本的程式下就能改變網頁的行為或是結果

只要在原本的 app 外面再包一層 Middleware, 就可以達到這樣的效果
( ex. 我們不用改任何原本的程式, 就可以把網頁產生的結果全部變成注音文 )

Middleware 不只有針對資料, 還有其它像可以對環境變數進行控制的功能, 它有錯誤的控制, 所以當內層拋出例外時, 它可以進行處理, 有著極大的彈性。
( 上下游都不需要知道彼此的存在, 他們只要在每一層做好他們該做的事就可以了 )

當使用者送出一個 Request 來到你伺服器,接著你的網頁程式產生內容,然後送出 Response 回去給 Browser

最簡單的網頁程式做的事情大概就像是這樣,但是真實世界的網頁程式要做的事情很多

他們得記錄 Session 資訊、取得 Cookie、認證、錯誤處理等等雜事

而傳統的架構你可以想像一下這些東西都沒有標準可言,都只限於單一的網頁程式,他們可能都跟特定模組糾結在一起

而 WSGI 的 Middleware 將這些該做的事都限定於 Middleware 中,它們跟上下游溝通的方式都是按照標準來實作的

這表示這些 Middleware 都能重覆被利用,這就是 WSGI 帶來的好處之一

Pylons 文件的例子
 

Pylons

Pylons use two main techniques:

1. A Model View Controller (MVC) architecture
2. Convention over configuration

 

 

MVC

Model View Controller


將一個網路應用程式分成三個獨立元件

  • Model
    • Programmer
    • 編寫程式功能(演算法)
    • 對資料直接存取的能力(資料庫存取)
  • View
    • 介面設計人員進行圖形介面設計
  • Controller
    • 控制應用程式流程(execute logic code)
    • 轉發、處理事件

 

Model
        網站後端所進行的「商業邏輯」,也就是對於各類資料的處理方法或是各種功能邏輯的處理方式,例如存取資料庫的邏輯、判斷使用者登入所輸入的密碼是否有不合法字元的邏輯等等。Model有直接存取資料庫的能力,專職於定義各種操作邏輯。

View
        前端檢視的部分,也就是我們所看到的網頁,也可以說是我們對網站所要求的服務結果呈現。View就是一個使用者與軟體系統溝通的一個介面,由於會是讓使用者直接存取到的一個單元,因此對於視覺上以及人因工程上會有較多的著墨,如畫面的排版、操作習慣的流暢度等等。

Controller
        做為網站的前端和後端居中協調的角色,針對不同類型的事件做整體流程的控制並做出適當的回應,事件的發起可以是前端使用者的服務要求或是後端資料庫的重新整理等等。

 
Code reuse
// 多個 view 能共享一個 model
// 舉例來說, 同個 web 應用程式會提供多種使用者介面
// email 可用 internet 介面 或是 手機上的 WAP 介面
改變一個不影響其他兩個
// Controller 將資料庫從 MySQL 移植到 Oracle
// 只需改變 Model
// View 永遠會正常顯示資料
Controller 可根據用戶需求
// 選擇適當的 Model 處理
// 適當的 View 將結果顯示給用戶

CoC

Convention Over Configuration


簡單來講就是用一些簡單的常規、慣例(convention)來取代繁雜的設定(configuration)。

這在很多先進的 framework 廣泛地被應用,目的就是要簡化開發者的工作,免除一些複雜的設定。

除非特別註明,本頁內容採用以下授權方式: Creative Commons Attribution-ShareAlike 3.0 License