python web开发 网络编程 HTTP协议、Web服务器、WSGI接口
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                python web开发 网络编程 HTTP协议、Web服务器、WSGI接口
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                文章目錄
- 1. HTTP協議
 - 2. Web服務器
 - 3. 靜態服務器
 - 創建 web_server.py
 
- 4. WSGI 接口
 - 4.1 CGI 通用網關接口
 - 4.2 WSGI
 - 4.3 定義 WSGI 接口
 - 4.4 運行 WSGI 服務
 
learning from 《python web開發從入門到精通》
1. HTTP協議
- 應用層最主要的協議:HTTP協議(HyperText Transfer Protocol 超文本傳輸協議)
 - 用戶訪問網站時,用戶瀏覽器是客戶端(向服務器發請求),網站被稱為服務器(收到請求,處理后的響應傳給客戶端),此過程通過 HTTP 協議實現
 - 利用 TCP 在兩臺計算機(如Web服務器,客戶端)之間傳輸信息,客戶端使用 web瀏覽器發送 HTTP 請求給 web 服務器,服務器發送響應給客戶端
 
2. Web服務器
當在瀏覽器中輸入 url 后:
Web 服務器工作原理:
- 建立連接:客戶端通過 TCP/IP 協議建立到服務器的 TCP 連接
 - 請求過程:客戶端向服務器發送 HTTP協議請求包,請求資源
 - 應答過程:服務器向客戶端發送 HTTP協議應答包,如果資源包含動態語言內容,會先進行處理,得到的數據返回客戶端,客戶端解釋 HTML 渲染在屏幕上
 - 關閉連接:斷開客戶端和服務器
 
常用請求方法:
- GET:請求指定頁面
 - POST:提交數據(表單或者文件等)
 - HEAD:類似GET,但僅僅獲取報頭
 - PUT:取代服務器上的指定文檔內容
 - DELETE:服務器刪除指定頁面
 - OPTIONS:允許客戶端查看服務器性能
 
返回狀態碼:
- 1**:請求收到,繼續處理
 - 2**:成功返回響應
 - 3**:重定向,為了完成請求,必須進一步執行的動作
 - 4**:客戶端錯誤,如語法錯誤,或者請求無法實現
 - 5**:服務器錯誤,服務器不能實現一種明顯無效的請求
 
瀏覽器 按 F12 可以查看相關信息
 
3. 靜態服務器
- 純粹的 HTML 頁面被稱為 靜態頁面
 
例子:創建一個靜態服務器,通過該服務器可以訪問包含兩個靜態頁面的網站
- 導航欄的網頁 simple_navbar.html
 
- contact.html,在上面的基礎上,添加一些額外的聯系信息
 
創建 web_server.py
實現客戶端和服務器的 HTTP 通信
注:由于 HTML 里面寫了很多下載的 css 文件地址,路徑總是報錯,最后還是 建議引用 CDN 寫法,相關庫地址查詢https://www.bootcdn.cn/
<link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/5.0.2/css/bootstrap.css" rel="stylesheet"> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js"></script> <script src="https://cdn.bootcdn.net/ajax/libs/popper.js/2.9.2/cjs/popper-base.js"></script> <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/5.0.2/js/bootstrap.js"></script> import socket import re from multiprocessing import Process # 多線程HTML_ROOT_DIR = './' # 設置靜態頁面的根目錄class HTTPServer:def __init__(self):self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)def start(self):self.server_socket.listen(128) # 最大連接數128print("服務器等待客戶端連接...")while True:client_socket, client_addr = self.server_socket.accept() # 建立客戶端連接print("[%s, %s]用戶連接上了" % client_addr)handle_client_process = Process(target=self.handle_client, args=(client_socket,))# 實例化線程,第一個參數調用函數 ,第二個參數 傳遞給前者的參數,元組形式handle_client_process.start() # 開啟線程client_socket.close() # 關閉客戶端socketdef handle_client(self, client_socket):# 處理客戶端請求request_data = client_socket.recv(1024) # 接收客戶端請求print("request data:", request_data)request_lines = request_data.splitlines() # 按行分割for line in request_lines:print(line) # 輸出信息request_start_line = request_lines[0] # 獲取請求報文print("*" * 10)print(request_start_line.decode("utf-8"))file_name = re.match(r"\w+ +(/[^ ]*) ", request_start_line.decode("utf-8")).group(1)# 使用正則表達式,提取請求的文件名,group(1) 列出第一個括號匹配部分if file_name == "/":file_name = "/simple_navbar.html"try:# 嘗試打開文件file = open(HTML_ROOT_DIR + file_name, "rb")except IOError:# 讀取文件失敗,返回404response_start_line = "HTTP/1.1 404 Not Found\r\n"response_headers = "Server: Michael server\r\n"response_body = "The file %s is not found! please check again!" % (HTML_ROOT_DIR + file_name)else:file_data = file.read()file.close()# 構造響應數據response_start_line = "HTTP/1.1 200 OK\r\n"response_headers = "Server: Michael server\r\n"response_body = file_data.decode("utf-8")# 拼接返回數據response = response_start_line + response_headers + "\r\n" + response_bodyprint("response data:", response)client_socket.send(bytes(response, "utf-8")) # 向客戶端發送響應數據client_socket.close() # 關閉客戶端連接def bind(self, port):self.server_socket.bind(("127.0.0.1", port))def main():http_server = HTTPServer()http_server.bind(8000)http_server.start()if __name__ == "__main__":main()
 
 
4. WSGI 接口
上面實現了一個靜態服務器,但是現在很少使用,更多的是使用 動態頁面,實現交互性
- 例如,注冊登錄網站,用戶輸入數據,web服務器不處理用戶數據(不是它的職責),CGI 誕生
 
4.1 CGI 通用網關接口
- Common Gateway Interface 是一段程序,運行在服務器上
 - web 服務器將請求發送給 CGI 應用程序,再將 CGI 動態生成的 HTML 頁面發送回客戶端
 
CGI 局限性:創建完解釋器進程,用完就拋棄,大量的請求導致服務器停機
- CGI 加強版 FastCGI 出現,其使用 進程/線程池 來處理一連串的請求
減少了 網頁服務器 與 CGI 程序之間 交互的開銷 
4.2 WSGI
- 在 FastCGI 標準下寫異步的 Web 服務不太方便,WSGI (Web Server Gateway Interface 服務器網關接口) 出現
 
下圖 from https://www.cnblogs.com/wilber2013/p/4763067.html
 
4.3 定義 WSGI 接口
最簡單的web版本 hello world
def applications(environ, start_response):start_response('200 OK', [('Content-Type', 'text/html')])return [b'<h1>Hello, Michael!</h1>']上面函數就是符合 WSGI 標準的一個 HTTP 處理函數
- environ :一個所有 HTTP 請求信息的字典對象
 - start_response:一個發送 HTTP 響應的函數
 
好處:web 解析 和 應用程序邏輯 分離,可以各自做自己擅長的事
python 內置了 WSGI:wsgiref 模塊(它沒有考慮運行效率,僅供開發測試)
4.4 運行 WSGI 服務
- wsgi_app.py
 
- wsgi_server.py
 
運行 wsgi_server.py ,在瀏覽器輸入 http://127.0.0.1:8000/ 就可以訪問網頁了
總結
以上是生活随笔為你收集整理的python web开发 网络编程 HTTP协议、Web服务器、WSGI接口的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: LeetCode 2150. 找出数组中
 - 下一篇: LeetCode 2089. 找出数组排