簡單的學了下Python, 然后用Python實現簡單的Web。
因為正在學習計算機網絡,所以通過編程來加強自己對於Http協議和Web服務器的理解,也理解下如何實現Web服務請求、響應、錯誤處理以及CGI協議
一、需要知識點:
1. HTTP 協議基本原理
2. 簡單的 Web 服務器框架
3. Python 語言的網絡開發
4. Web 服務請求,響應及錯誤處理的實現
5. CGI 協議的 Python 實現
我用的Python3.5
二、原理:
web 程序都運行在 TCP/IP 協議上, 程序之間使用 socket(套接字)
進行通信,它能夠讓計算機之間的通信就像寫文件和讀文件一樣簡單。 一個 tcp
socket 由一個 IP 地址和端口號組成。
a. IP 地址是一個 32 位的二進制數,通常被分割為 4 個“8 位二進制數”,寫成 10
進制的形式就是我們常見的 174.136.14.108。我們通過 IP 地址來標識所連
接的主機。
b. 端口號是一個范圍在 0-65535 之間的數字,一台主機上可能同時有多個
sockets,因此需要端口號進行標識。端口號 0-1023 是保留給操作系統使用
的,我們可以使用剩下的端口號。
超文本傳輸協議(HTTP)描述了一種程序之間交換數據的方法,它非常簡單易用,
在一個 socket 連接上, 客戶端首先發送請求說明它需要什么, 然后服務器發送響應,
並在響應中包含客戶端的數據。響應數據也許是從本地磁盤上復制來的,也許是程
序動態生成的。傳輸過程如圖:
HTTP 請求就是一段文本,任何程序都能生成一個 http 請求,就像生成文本一樣簡
單。這段文本需要包含以下這些部分:
HTTP method:HTTP 請求方法。最常用的就是 GET (抓取數據)與 POST (更新
數據或者上傳文件)
URL: 通常是客戶端請求的文件的路徑, 比如 /research/experiments.html,
但是是否響應文件都是由服務器決定的。
HTTP version:HTTP 版本。通常是 HTTP/1.0 或 HTTP/1.1
header field:HTTP 頭內的鍵值對,做一些基本設置,就像下面這樣:
#客戶端接受的數據類型 Accept: text/html #客戶端接受的語言 Accept-Language: en, fr If-Modified-Since: 16-May-2005
body: 一些與請求有關的負載數據了。比如在一個網站登陸的時候提交登
陸表單,那負載數據就是你的賬號與密碼信息了。
HTTP 響應的結構類似於請求:
status code:狀態碼。請求成功響應 200,請求的文件找不到則響應 404。
status phrase:對狀態碼的描述
下面進行第一個Web服務器, 基本概念十分簡單:
1.等待某萌連接我們的服務器並向我們發送一個HTTP請求
2.解析該請求
3.了解該請求希望請求的內容
4.服務器根據請求抓取需要的數據(從服務器本地文件中讀取或者程序動態生成)
5.將數據格式化為請求需要的格式
6.送回HTTP響應
上面的1,2,6的操作對所有的WEb應用都是一樣的, 這部分內容Python標准庫中的BaseHttpServer模塊可以幫助我們處理啦。所以現在我們就僅僅需要關注3,4,5了:
首先呢,在工作目錄下創建server.py文件:
import BaseHttpServer class RequestHandler(BaseHttpServer.BaseHttpRequestHandler: """docstring for RequestHandler(BaseHttpServer.BaseHttpRequestHandler""" #page model Page = '''\ <html> <body> <p>I believe in you, Web!</p> </body> </html> ''' #deal with a get request def do_GET(self): #super(RequestHandler(BaseHttpServer.BaseHttpRequestHandler, self).__init__() self.send_response(200) self.send_header("Content-Type", "text/html") self.send_header("Content-Length", str(len(self.Page))) self.end_headers() self.wfile.write(self.Page) #-------------colorful Luxuriant lineO(∩_∩)O哈哈~---------- if __name__ == '__main__': serverAddress = ('127.0.0.1', 5555) server = BaseHttpServer.HttpServer(serverAddress, RequestHandler) server.serve_forever()
模塊的BaseHttpRequestHandler類可以幫助我們處理對請求的解析,並通過確定請求的方法類調用其所對應的函數, 如當方法是GET時,該類就會調用名為do_GET的方法。RequestHandler繼承了BaseHttpRequestHandler並重寫了do_GET方法,他的效果可以從代碼中所示返回Page的內容。Content-Type告訴客戶端要處理html文件的方式處理返回的內容。end_headers方法會插入一個空白行,前面的Request結構圖所示可知。
運行程序,打開瀏覽器訪問,此時我們的第一個web服務器就已經完成啦~~
后續會變動下,趕去寫作業了。。。。。
可以在Python網站上更好的學習https://wiki.python.org/moin/BaseHttpServer