在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類。它的定義非常簡單,只是重寫了其中的一個方法。
1 2 3 4 5 6 7 8 |
class HTTPServer(SocketServer.TCPServer): allow_reuse_address = 1 # Seems to make sense in testing environment def server_bind(self): """Override server_bind to store the server name.""" SocketServer.TCPServer.server_bind(self) host, port = self.socket.getsockname()[:2] self.server_name = socket.getfqdn(host) self.server_port = port |
重寫的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指代GET、POST、HEAD等請求方法,需要在請求處理類中構建具體的請求處理方法,例如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_GET、do_POST等方法,其他繼承該類的請求處理類需要自己實現這些方法,已完成對具體請求的處理。對此,可以參考SimpleHTTPServer模組,也可檢視文章SimpleHTTPServer——一個簡單的HTTP伺服器。