Python中WEB開發(一)

奔跑的小狼狗發表於2018-06-26

CS即客戶端、伺服器程式設計:

客戶端、服務端之間需要使用Socket,約定協議、版本(往往使用的協議是TCP或者UDP),制定地址和埠,就可以通訊了。

客戶端、服務端傳輸資料,資料可以有一定的格式,雙方必須線約定好。

BS程式設計,即Browser、Server開發:

Browser瀏覽器,一種特殊的客戶端,支援HTTP(s)協議,能夠通過URL向服務端發起請求,等待服務端返回HTML等資料,並在瀏覽器內視覺化展示的程式。

Server,支援HTTP(s)協議,能夠接受眾多客戶端發起的HTTP協議請求,經過處理,將HTML等資料返回給瀏覽器。

本質上來說,BS是一種特殊的CS,即客戶端必須是一種支援HTTP協議且能解析並渲染HTML的軟體,服務端必須是能夠接收客戶端HTTP訪問的服務軟體。

HTTP協議底層基於TCP協議實現。

BS開發分為兩端開發:

(1) 客戶端開發,或稱前端開發。HTML,CSS,JavaScript等。

(2)服務端開發,Python有WSGI、Flask、Tornado等。

HTTP協議

協議

HTTP協議是無狀態協議。

同一個客戶端的兩次請求之間沒有任何關係,從伺服器端角度來說,它不知道這兩個請求來自同一個客戶端。

cookie

鍵值對資訊。

瀏覽器發起每一請求時,都會把cookie資訊發給伺服器端。

是一種客戶端、服務端傳遞資料的技術。

服務端可以通過判斷這些資訊,來確定這次請求是否和之前的請求有關聯。

一般來說cookie資訊實在伺服器端生成,返回給客戶端的。

客戶端可以自己設定cookie資訊。

URL組成

URL可以說就是地址,uniform resource locator 統一資源定位符,每一個連結指向一個資源供客戶端訪問。

schema://host[:port#]/path/.../[;url-params][?query-string][#anchor]

例如,通過下面URL訪問網頁:

http://www.magedu.com/pathon/index.html?id=5&name=python

訪問靜態資源時,通過上面的這個URL訪問的是網站的某路徑下的Index.html檔案,而這個檔案對應磁碟上的真實的檔案。就會從磁碟上讀取這個檔案,並把檔案的內容發揮瀏覽器端。

scheme模式、協議:

http、ftp、https、file、mailto等等。mysql等都是類似這樣寫。

host:port   :

www.magedu.com:80,80埠是預設埠可以不寫。域名會使用DNS解析,域名會解析成IP才能使用。實際上會對解析後返回的IP的TCP的80埠發起訪問。

/path/to/resource:

path,指向資源的路徑。

?key1=value1&key2=value2:

query string , 查詢字串,問號分割,後面key=value形式,且使用&符號分割。

HTTP訊息 

訊息分為Request、Response。

Request:瀏覽器向伺服器發起的請求。

Response:伺服器對客戶端請求的響應。

請求和響應訊息都是由請求行、Header訊息報頭、Body訊息正文組成。

請求

請求訊息行:請求方法Method 請求路徑 協議版本 CRLF


請求方法Method:

GET    請求獲取URL對應的資源

POST    提交資料至伺服器端

HEAD    和GET類似,不過不返回訊息正文

常見傳遞資訊的方式:

(1)  GET方法使用Query String

http://www.magedu.com/pathon/index.html?id=5&name=python

通過查詢字串在URL中傳遞引數

(2) POST方法提交資料


(3) URL中本身就包含著資訊

http://www.magedu.com/python/student/001

響應

響應訊息行:協議版本 狀態碼 訊息描述 CRLF


status code狀態碼:

狀態碼在響應頭第一行:

    1xx :提示資訊,表示請求已被成功接收,繼續處理

    2xx: 表示正常響應

              200 正常返回了網頁內容

    3xx:    重定向

               301 頁面永久性移走,永久重定向。返回新的URL,瀏覽器會根據返回的URL發起新的Request請求。

               302 臨時重定向

               304 資源未修改,瀏覽器使用本地快取

    4xx:    客戶端請求錯誤

               404  Not Found , 網頁找不到,客戶端請求的資源有錯

               400  請求語法錯誤

               401  請求要求身份驗證

    5xx:    伺服器端錯誤

               500  伺服器內部錯誤

               502  上游伺服器錯誤,如nginx反向代理的時候

無狀態,有連線和短連線

無狀態:伺服器無法知道兩次請求之間的聯絡,即使是前後兩次同一個瀏覽器也沒法判斷出是出於一個瀏覽器的請求。後面通過cookie和session來判斷。

有連線:是因為它基於TCP協議,是面向連線的,需要3次握手、4次斷開。

短連線:自HTTP 1.1之前,都是一個請求一個連線,而TCOP的連線建立銷燬成本高,對伺服器有很大的影響。所以,自HTTP 1.1之後,支援keep-alive,預設也是開啟的,一個連線開啟後,會保持一段時間(可設定),瀏覽器再訪問該伺服器就使用這個TCP連線,減輕了伺服器壓力,提高了效率。

WSGI

WSGI主要規定了伺服器端和應用程式之間的介面。


WSGI伺服器--wsgiref(實驗用)

wsgiref是一個WSGI參考實現庫。

wsgiref.simple_server 模組實現一個簡單的WSGI HTTP伺服器。

wsgiref.simple_server.make_server(host,port,app,server_class=WSGIServer,handler_class=WSGIRequestHandler) 啟動一個WSGI伺服器。

wsgiref.simple_server.demo_app(environ,start_response) 一個函式,小巧完整的WSGI的應用程式的實現。


WSGI 伺服器作用

(1) 監聽HTTP服務埠(TCPServer,預設埠80)

(2)接收瀏覽器端的HTTP請求並解析封裝成environ環境資料

(3)負責呼叫應用程式,將environ和start_response方法傳入

(4)將應用程式響應的正文封裝成HTTP響應報文返回給瀏覽器端

WSGI APP應用程式端

1、應用程式應該是一個可呼叫物件,Python中應該是函式、類、實現了__call__方法的類的例項。

2、這個可呼叫物件應該接收兩個引數


3、以上可呼叫物件的實現,都必須返回一個可迭代物件


environ和start_response這兩個引數名可以是任何合法名,但是一般預設都是這2個名字。

environ

environ是包含HTTP請求資訊的dict物件


start_response

它是一個可呼叫物件。有三個引數,定義如下:

start_response(status,response_headers,exc_info=None)

status 是狀態碼,如 200  OK

response_headers 是一個元素為二元組的列表,例如[('Content-Type','text/plain;charset=utf-8')]

exc_info  在錯誤處理的時候使用

start_response  應該在返回可迭代物件之前呼叫,因為它返回的是Rsponse Header。返回的可迭代物件是Response Body.

伺服器端

伺服器程式需要呼叫符合上述定義的可呼叫物件APP,傳入environ 、start_response, APP處理後,返回響應頭和可迭代物件的正文,由伺服器封裝返回瀏覽器端。


simple_server 只是參考用,不能用於生產

測試用命令


-I  使用HEAD方法

-X 指定方法,-d 傳輸資料

到這裡,就完成了一個簡單的WEB程式開發。

WEB伺服器

1、本質上就是一個TCP伺服器,監聽在特定埠上

2、支援HTTP協議,能夠將HTTP請求報文進行解析,能夠把響應資料進行HTTP協議的報文封裝並返回瀏覽器端。

3、實現了WSGI協議,該協議約定了和應用程式之間的介面。

APP應用程式

1、遵從WSGI協議

2、本身是一個可呼叫物件

3、呼叫start_response,返回響應頭部

4、返回包含正文的可迭代物件

相關文章