1. 程式人生 > >Python的學習(十四)---- 實現簡單的HTTP伺服器

Python的學習(十四)---- 實現簡單的HTTP伺服器

用Python實現簡單的HTTP伺服器

用於搭建http server的模組有如下三種:
1)BaseHTTPServer:提供基本的Web服務和處理器類,分別是HTTPServer及BaseHTTPRequestHandler;
2)SimpleHTTPServer:包含執行GET和HEAD請求的SimpleHTTPRequestHandler類;
3)CGIHTTPServer:包含處理POST請求和執行的CGIHTTPRequestHandler類。
在我目前的實現中,主要採用BaseHTTPServer模組。

一、 BaseHTTPServer模組

HTTPServer是一個SocketServer.TCPServer的子集,建立並監聽HTTP套接字,分配requests到處理器(handler), BaseHTTPRequestHandler在HTTP請求到達時進行處理,但其自身並不能對請求作出相應,由另一個派生類來處理每一個請求方法。BaseHTTPRequestHandler為子集提供許多類變數、例項變數和方法,其分析請求物件和請求頭部,並根據請求型別呼叫相應的方法。一般這個模組不被直接使用,而是被用來作為構建功能性Web伺服器的一個基類。

BaseHTTPRequestHandler其中的例項變數有:

1)client_address 包含關聯的客戶端地址(host, port)

2)command 包含請求型別(eg: get )

3)path 包含的請求路徑

4)request_version 包含請求版本的字串(eg: 'HTTP/1.0')

5)headers

6)rfile 輸入流

7)wfile 包含寫到客戶端響應的輸出流

BaseHTTPRequestHandler的類變數有:

1)server_version 指定伺服器軟體版本

2)sys_version Python系統版本

3)error_message_format

4)protocol_version 響應中使用的HTTP協議版本

BaseHTTPRequestHandler部分操作

1)handle()

2)send_error(code[, message]) 傳送並記錄一個完整的錯誤回覆到客戶端

3)send_response(code[, message]) 傳送一個響應頭並記錄已接收的請求

4)send_header(keyword, value) 編寫一個指定的HTTP頭到輸出流

5)version_string() 飯後伺服器軟體的版本字串

日誌記錄相關部分沒有一一列出。。。。

二、簡單建立server例項

以下是一個簡單的建立http server的例子,網上有些是採用多執行緒實現的比較複雜的例子

1. 建立server

    1)DOS 命令
          在DOS裡cd到準備做伺服器根目錄的路徑下,執行命令
          python -m BaseHTTPServer [port]
          預設的埠號是8000, 伺服器根目錄就是執行python命令的工作目錄,server建立好後預設啟動成功
    2)Python指令碼啟動

from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
class TestHTTPHandle(BaseHTTPRequestHandler):
    def do_GET(self):

        buf = 'It works"
        self.protocal_version = “HTTP/1.1" 

        self.send_response(200)

        self.send_header("Welcome", "Contect")       

        self.end_headers()

        self.wfile.write(buf)

def start_server(port):
    http_server = HTTPServer(('[IP]', int(port)), TestHTTPHandler)
    http_server.serve_forever() #設定一直監聽並接收請求
其中,IP為給localhost設定的訪問地址


2. 瀏覽器訪問

3. 伺服器關閉

    1) dos

          在執行介面中輸入 "ctrl + C" 停止

    2)python指令碼

         需停止埠監聽及相關python程序

      def stop_server(server)

          server.sorket.close()