Python 實現簡單的 Web


 

 

 

 

 

 

 

簡單的學了下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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM