日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python web开发 网络编程 HTTP协议、Web服务器、WSGI接口

發布時間:2024/7/5 python 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 后:

  • 瀏覽器請求 DNS 服務器,進行域名解釋,獲得 站點 IP 地址
  • 發送一個 HTTP Request 請求 給擁有該 IP 的主機
  • 收到服務器返回的 HTTP Response響應,瀏覽器渲染效果后呈現給用戶
  • 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
    <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>使用bootstrap框架制作導航欄</title><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></head> <body><nav class="navbar navbar-expand-sm navbar-light bg-light"><div class="container-fluid"><a class="navbar-brand" href="https://michael.blog.csdn.net/">我的導航</a><button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent"aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"><span class="navbar-toggler-icon"></span></button><div class="collapse navbar-collapse" id="navbarSupportedContent"><ul class="navbar-nav me-auto mb-2 mb-lg-0"><li class="nav-item"><a class="nav-link active" aria-current="page" href="https://michael.blog.csdn.net/">主頁</a></li><li class="nav-item"><a class="nav-link" href="#">鏈接</a></li><li class="nav-item dropdown"><a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button"data-bs-toggle="dropdown" aria-expanded="false">關于作者</a><ul class="dropdown-menu" aria-labelledby="navbarDropdown"><li><a class="dropdown-item" href="#">簡歷</a></li><li><a class="dropdown-item" href="#">項目</a></li><li><hr class="dropdown-divider"></li><li><a class="dropdown-item" href="contact.html">聯系方式</a></li></ul></li><li class="nav-item"><a class="nav-link disabled">商城</a></li></ul><form class="d-flex"><input class="form-control me-2" type="search" placeholder="輸入你的關鍵詞" aria-label="Search"><button class="btn btn-outline-success" type="submit">站內搜索</button></form></div></div> </nav></body> </html>
    • contact.html,在上面的基礎上,添加一些額外的聯系信息
    <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>聯系michael</title><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></head> <body><nav class="navbar navbar-expand-sm navbar-light bg-light"><div class="container-fluid"><a class="navbar-brand" href="https://michael.blog.csdn.net/">我的導航</a><button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent"aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"><span class="navbar-toggler-icon"></span></button><div class="collapse navbar-collapse" id="navbarSupportedContent"><ul class="navbar-nav me-auto mb-2 mb-lg-0"><li class="nav-item"><a class="nav-link active" aria-current="page" href="https://michael.blog.csdn.net/">主頁</a></li><li class="nav-item"><a class="nav-link" href="#">鏈接</a></li><li class="nav-item dropdown"><a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button"data-bs-toggle="dropdown" aria-expanded="false">關于作者</a><ul class="dropdown-menu" aria-labelledby="navbarDropdown"><li><a class="dropdown-item" href="#">簡歷</a></li><li><a class="dropdown-item" href="#">項目</a></li><li><hr class="dropdown-divider"></li><li><a class="dropdown-item" href="contact.html">聯系方式</a></li></ul></li><li class="nav-item"><a class="nav-link disabled">商城</a></li></ul><form class="d-flex"><input class="form-control me-2" type="search" placeholder="輸入你的關鍵詞" aria-label="Search"><button class="btn btn-outline-success" type="submit">站內搜索</button></form></div></div> </nav><div class="bs-docs-header" id="content" tabindex="-1"><div class="container"><h1> 聯系michael </h1><div class="lead"><address>電子郵件:<strong>michael@xxx.com</strong><br>地址:地球村86號<br>郵政編碼:<strong>xxxxxx</strong><br><abbr title="Phone">聯系電話:</abbr> 1234567890</address></div></div> </div></body> </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 應用程序 def app(environ, start_response):# 響應信息start_response('200 OK', [('Content-Type', 'text/html')])file_name = environ['PATH_INFO'][1:] or 'simple_navbar.html'HTML_ROOT_DIR = './'try:# 打開文件file = open(HTML_ROOT_DIR + file_name, 'rb')except IOError:# 響應異常response_body = "{} not found".format(HTML_ROOT_DIR + file_name)else:# 讀取文件file_data = file.read()file.close()# 構造響應數據response_body = file_data.decode('utf-8')return [response_body.encode('utf-8')] # 返回數據
    • wsgi_server.py
    # WSGI 服務器 from wsgiref.simple_server import make_server from wsgi_app import app# 創建一個服務器,IP地址為空,端口號為8000,處理函數是app httpd = make_server('', 8000, app) print('Serving HTTP on port 8000...') httpd.serve_forever() # 開始監聽HTTP請求

    運行 wsgi_server.py ,在瀏覽器輸入 http://127.0.0.1:8000/ 就可以訪問網頁了

    總結

    以上是生活随笔為你收集整理的python web开发 网络编程 HTTP协议、Web服务器、WSGI接口的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 日日摸日日碰夜夜爽av | 免费网站在线观看黄色 | 伊人超碰在线 | 女同互舔视频 | 夜操操| 国产精品无码999 | 欧美黄色三级 | 婷婷久久一区 | av在线精品 | 手机在线看片1024 | 日本中文字幕在线不卡 | 伊人影院中文字幕 | 伊人影院在线播放 | 超碰在线观看91 | 久久成人毛片 | 国产免费一区二区三区三州老师 | 亚洲www视频 | 在哪里可以看黄色片 | 国产一区在线视频观看 | 久久人人爽 | 日韩一二三区在线观看 | 亚洲日本精品一区 | 精品人妻一区二区三区日产乱码 | 床戏高潮呻吟声片段 | aaa级片| 午夜免费福利网站 | 亚洲精品一级片 | 成年人精品视频 | 欧美在线v| 美女扒开尿口给男人捅 | 四虎视频在线 | 欧美一区二区久久久 | 黄色在线观看免费视频 | 福利在线视频导航 | 天堂资源| 久久精品成人一区二区三区蜜臀 | 久色精品视频 | 国产美女在线精品 | 日本天堂在线观看 | 最新中文字幕免费 | 国产观看 | av福利片 | 日韩va| 黑人激情视频 | 亚洲天堂免费看 | 性欧美video另类hd尤物 | 国产又爽又黄无码无遮挡在线观看 | 国产无遮挡又黄又爽又色视频 | 在线你懂 | 黄色一级片免费播放 | 在线观看黄色片 | 午夜视频在线网站 | 超碰碰97 | 亚洲综合网在线 | 四虎影视成人永久免费观看亚洲欧美 | 青草久久网| 人妻互换 综合 | 国产激情久久久久久熟女老人av | 国产男女猛烈无遮挡 | 国内精品人妻无码久久久影院蜜桃 | 欧美一区三区三区高中清蜜桃 | 老女人黄色片 | 91蜜桃| 亚洲另类自拍 | 精品丝袜一区 | 天天夜夜草 | 波多野结衣视频播放 | 日韩精品免费一区二区三区 | 亚洲色图狠狠干 | 成人在线免费看片 | 欧美性做爰大片免费 | 动漫美女舌吻 | 91传媒在线免费观看 | 亚洲国产精品午夜久久久 | 久久综合伊人77777麻豆 | 足疗店女技师按摩毛片 | 97天天操 | 色吧综合网 | 精品国产第一页 | 国产精品普通话 | 亚洲高清视频在线 | www.日日操 | 精品国产美女 | 久久亚洲a v | 欧美一级二级三级 | 久久久久久免费精品 | 免费观看成人鲁鲁鲁鲁鲁视频 | 伊人焦久影院 | 国产成人精品一区二区三区在线观看 | 国产婷婷久久 | 精品少妇无码av无码专区 | 成人深夜视频在线观看 | 国产福利一区二区视频 | 五月开心播播网 | 毛片免费一区二区三区 | 琪琪五月天| 亚洲美女一区二区三区 | 激情婷婷在线 | 麻豆md0034在线观看 |