国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python模塊WSGI使用詳解

2020-02-22 23:05:49
字體:
來源:轉載
供稿:網友

WSGI(Web Server Gateway Interface):Web服務網關接口,是Python中定義的服務器程序和應用程序之間的接口。

Web程序開發中,一般分為服務器程序和應用程序。服務器程序負責對socket服務的數據進行封裝和整理,而應用程序則負責對Web請求進行邏輯處理。

Web應用本質上也是一個socket服務器,用戶的瀏覽器就是一個socket客戶端。

我們先用socket編程實現一個簡單的Web服務器:

import socket  def handle_request(client):   buf = client.recv(1024)   print(buf)   msg = "HTTP/1.1 200 OK/r/n/r/n" #HTTP頭信息   client.send(('%s' % msg).encode())   msg = "Hello, World!"   client.send(('%s' % msg).encode())  def main():   ip_port = ("localhost", 8000)   sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)   sock.bind(ip_port)   sock.listen(5)    while True:     conn, addr = sock.accept()     handle_request(conn)     conn.close()  if __name__ == "__main__":   main() 

上述代碼中,main()函數就是服務器函數,handle_request()就是應用程序。
下面我們再用python的wsgiref模塊來實現跟上述代碼一樣的Web服務器:

from wsgiref.simple_server import make_server  def handle_request(env, res):   res("200 OK",[("Content-Type","text/html")])   body = "<h1>Hello World!</h1>"   return [body.encode("utf-8")]  if __name__ == "__main__":   httpd = make_server("",8000,handle_request)   print("Serving http on port 80000")   httpd.serve_forever() 

上面兩份代碼實現的效果是一樣的,調用wsgiref模塊則明顯節省了代碼量,是整個程序更加簡潔。
wsgiref模塊封裝了socket服務端的代碼,只留下一個調用的接口,省去了程序員的麻煩,程序員可以將精力放在Web請求的邏輯處理中。

以上述的代碼為例,詳細看一下wsgiref模塊的源碼中一些關鍵的地方:

if __name__ == "__main__":   httpd = make_server("",8000,handle_request)   print("Serving http on port 80000")   httpd.serve_forever() 

1、整個程序的入口為make_server()函數:

def make_server(host, port, app, server_class=WSGIServer, handler_class=WSGIRequestHandler):   """Create a new WSGI server listening on `host` and `port` for `app`"""   server = server_class((host, port), handler_class) #默認創建一個WSGIServer類   server.set_app(app) #將應用程序,即邏輯處理函數傳給類   return server 

2、make_server()函數默認生成一個WSGIServer類:

class WSGIServer(HTTPServer):
class HTTPServer(socketserver.TCPServer):
class TCPServer(BaseServer):

WSGIServer,HTTPServer兩個類沒有初始化函數,調用父類的初始化函數,TCPServer類的__init__()函數拓展了BaseServer

類的__init__()函數:

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 西和县| 肃北| 黎城县| 武强县| 武威市| 随州市| 洛宁县| 长丰县| 体育| 新乡市| 新田县| 白水县| 潼南县| 岳普湖县| 焦作市| 济阳县| 中宁县| 合水县| 龙山县| 乐都县| 鲁山县| 株洲县| 溧水县| 周口市| 通道| 伊金霍洛旗| 西乌珠穆沁旗| 札达县| 泰兴市| 团风县| 潼关县| 桐柏县| 冷水江市| 界首市| 马鞍山市| 乃东县| 科技| 大荔县| 剑阁县| 纳雍县| 房山区|