python 内置标准库socketserver模块的思考
socketserver模塊簡(jiǎn)化了編寫網(wǎng)絡(luò)服務(wù)器的任務(wù), 在很大程度上封裝了一些操作, 你可以看成是事件驅(qū)動(dòng)型的設(shè)計(jì), 這很不錯(cuò)。它定義了兩個(gè)最基本的類--服務(wù)器類 BaseServer, 請(qǐng)求處理類 BaseRequestHandler.
BaseServer 基本服務(wù)器類封裝了基本的一些socket操作, socket原語(yǔ)中對(duì)socket的相關(guān)操作僅僅封裝到了accept 方法, 此方法之前的操作也封裝完了, 接下來(lái)的send, recv原語(yǔ)操作就沒(méi)有在進(jìn)行封裝了, 那么它哪去了呢?這是socketserver模塊設(shè)計(jì)的很好的地方, socketserver不僅僅有對(duì)socket原語(yǔ)操作的, 還有對(duì)需要進(jìn)行具體處理的基類封裝, 那就是BaseRequestHandler 類.舉兩個(gè)例子, 首先是WSGI協(xié)議的處理, 具體請(qǐng)看<深入淺出web服務(wù)器與python應(yīng)用程序之間的聯(lián)系 http://www.cnblogs.com/zhiyong-ITNote/p/7522093.html>. 找到python 的安裝目錄里面的wsgiref 文件夾, 我們分析下simple_server.py模塊, 以及handlers.py模塊。
注意下 simple_server.py模塊的make_server 函數(shù), 該函數(shù)的第五個(gè)參數(shù)就是自定義的請(qǐng)求處理類, 我們利用這個(gè)類來(lái)處理WSGI協(xié)議, 以實(shí)現(xiàn)服務(wù)器與python 應(yīng)用程序之間的通信. 我們看看這個(gè)類的繼承順序:
WSGIRequestHandler → BaseHTTPRequestHandler → StreamRequestHandler → BaseRequestHandler.
我們看看最終父類的實(shí)現(xiàn):
我們注意下注釋中對(duì)handle() 函數(shù)的解釋, 此函數(shù)是對(duì)每個(gè)請(qǐng)求的實(shí)際處理. 我們回到WSGIRequestHandler的程序中, WSGIRequestHandler 類中有一個(gè)handle() 函數(shù), 此函數(shù)就是重寫并實(shí)現(xiàn)了基類的handle() 函數(shù), 將請(qǐng)求處理分到了handlers.py這個(gè)模塊中, 用來(lái)處理WSGI協(xié)議.
第二個(gè)例子就是python 自帶的HTTPServer, 我們?cè)趐ython 3下啟動(dòng)自帶的HTTPServer, 在命令行敲入:
python -m http.server 8000
看看瀏覽器的響應(yīng):
打開(kāi)python安裝目錄下的http文件夾, 我們看看server.py這個(gè)文件, 然后我們看看test() 這個(gè)測(cè)試函數(shù)的代碼, 找到其中的HandlerClass變量, 其指向的是SimpleHTTPRequestHandler類, 我們看看這個(gè)類的繼承順序:
SimpleHTTPRequestHandler → BaseHTTPRequestHandler → StreamRequestHandler → BaseRequestHandler
上面的第三個(gè)類是用來(lái)處理TCP流式通信的, 可以看到HTTPServer 的請(qǐng)求處理最后還是基于BaseRequestHandler類, 而且具體的還是使用handle() 函數(shù)來(lái)處理, BaseHTTPRequestHandler類中的handle() 函數(shù)分發(fā)了處理請(qǐng)求的任務(wù)給其他函數(shù).
最后做下總結(jié)吧, python兩個(gè)內(nèi)置的實(shí)現(xiàn)都是基于socketserver.py模塊, 主要就是調(diào)用了BaseServer類與BaseRequestHandler類, 前者封裝了基本的socket處理, 后者封裝了對(duì)請(qǐng)求的處理, 通過(guò)其內(nèi)的handle()函數(shù)將請(qǐng)求處理分發(fā)給了其他的具體處理.
更多專業(yè)前端知識(shí),請(qǐng)上 【猿2048】www.mk2048.com
總結(jié)
以上是生活随笔為你收集整理的python 内置标准库socketserver模块的思考的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 腾讯TBS X5 WebView的简单使
- 下一篇: python3-开发进阶-RESTful