BaseHTTPServer ——實現 Web 伺服器

發表於2017-09-20

SocketServer——網路通訊伺服器中我們介紹了Python標準庫中的SocketServer模組,瞭解了要實現網路通訊服務,就要構建一個伺服器類和請求處理類。同時,該模組還為我們建立了不同的伺服器類和請求處理類。

1.伺服器類

  • BaseServer
  • TCPServer(BaseServer)
  • UDPServer(TCPServer)
  • UnixStreamServer
  • UnixDatagramServer

2.請求處理類

  • BaseRequestHandler
  • StreamRequestHandler(BaseRequestHandler)
  • DatagramRequestHandler(BaseRequestHandler)

通過伺服器類和請求處理類的搭配,我們可以建立不同型別的伺服器,實現不同的協議型別。本文介紹的BaseHTTPServer模組便是繼承TCPServer和StreamRequestHandler,實現了Web伺服器的通訊。

HTTP伺服器

HTTP伺服器繼承自SocketServer模組中的TCPServer類。它的定義非常簡單,只是重寫了其中的一個方法。

重寫的server_bind()方法主要是為了獲取伺服器名和埠。其餘方法以及伺服器的實現過程詳見SocketServer——網路通訊伺服器

此外,還可以從SocketServer模組中引入’mix-in’類,基於HTTPServer建立支援程式或執行緒的伺服器。

HTTP請求處理基類

為了處理HTTP請求,BaseHTTPServer模組構造了HTTP請求處理基類BaseHTTPRequestHandler,它繼承自SocketServer模組中的StreamRequestHandler類。

HTTP請求處理基類中有一些重要的方法:

1.handle() ——這個方法是請求處理類真正處理請求具體工作的方法,例如解析到來的請求,處理資料,併發迴響應等。在BaseHTTPRequestHandler中它是一個入口檔案,將呼叫其他的方法完成請求處理。

2.handle_one_request() ——由handle()呼叫,用於處理請求。其主要工作包括:

  • 呼叫parse_request()方法,解析請求,獲取請求報文中的資訊,包括請求的方法、請求URL、請求的HTTP版本號、請求首部等。如果解析失敗,則呼叫send_error()方法發回一個錯誤響應。
  • 呼叫do_SPAM() 方法。這個方法中的SPAM指代GETPOSTHEAD等請求方法,需要在請求處理類中構建具體的請求處理方法,例如do_GET處理GET請求,do_POST處理POST請求。do_SPAM() 方法可以呼叫send_response()send_header()end_headers()等方法建立響應首行和響應首部等內容。

3.parse_request() ——解析請求。

4.send_error() ——發回錯誤響應。

5.send_response() ——建立響應首行和響應首部等內容。

6.send_header() ——設定響應首部內容。

7.end_headers() ——呼叫此方法可以在首部後增加一個空行,表示首部內容結束(不適用於HTTP/0.9)

8.還包括其他的一些輔助函式。

需要注意的是:BaseHTTPRequestHandler是HTTP請求處理的基類,並不包含諸如do_GETdo_POST等方法,其他繼承該類的請求處理類需要自己實現這些方法,已完成對具體請求的處理。對此,可以參考SimpleHTTPServer模組,也可檢視文章SimpleHTTPServer——一個簡單的HTTP伺服器

相關文章