挺久沒(méi)寫(xiě)博客了,因?yàn)椴┲鏖_(kāi)始了今年另一段美好的實(shí)習(xí)經(jīng)歷,學(xué)習(xí)加做項(xiàng)目,時(shí)間已排滿;很感謝今年這兩段經(jīng)歷,讓我接觸了golang和python,學(xué)習(xí)不同語(yǔ)言,可以跳出之前學(xué)習(xí)c/c++思維的限制,學(xué)習(xí)golang和python的優(yōu)秀特性以及了解在不同的場(chǎng)景,適用不同的語(yǔ)言;而之前學(xué)習(xí)linux和c/c++,也使我很快就上手golang和python;
我學(xué)習(xí)的習(xí)慣,除了學(xué)習(xí)如何使用,還喜歡研究源碼,學(xué)習(xí)運(yùn)行機(jī)制,這樣用起來(lái)才會(huì)得心應(yīng)手或者說(shuō),使用這些語(yǔ)言或框架,就和平時(shí)吃飯睡覺(jué)一樣,非常自然;因?yàn)樽罱薪佑|到bottle和flask web框架,所以想看下這兩個(gè)的源碼,但是這兩個(gè)框架是基于python自帶的http,因此就有了這篇文章;
python http簡(jiǎn)單例子
python http框架主要有server和handler組成,server主要是用于建立網(wǎng)絡(luò)模型,例如利用epoll監(jiān)聽(tīng)socket;handler用于處理各個(gè)就緒的socket;先來(lái)看下python http簡(jiǎn)單的使用:
import sysfrom http.server import HTTPServer,SimpleHTTPRequestHandlerServerClass = HTTPServerHandlerClass = SimpleHTTPRequestHandlerif__name__ =='__main__': port = int(sys.argv[2]) server_address = (sys.argv[1],port) httpd = ServerClass(server_address,HandlerClass)sa=httpd.socket.getsockname()print("Serving HTTP on",sa[0],"port",sa[1],"...")try: httpd.serve_forever() except KeyboardInterrupt:print("/nKeyboard interrupt received, exiting.") httpd.server_close() sys.exit(0)
運(yùn)行上述例子,可以得到如下:
python3 myhttp.py 127.0.0.1 9999
此時(shí)如果在當(dāng)前文件夾新建一個(gè)index.html文件,就可以通過(guò) http://127.0.0.1:9999/index.html 訪問(wèn)了index.html頁(yè)面了。
這個(gè)例子的server類(lèi)用的是HTTPServer,handler類(lèi)是SimpleHTTPRequestHandler,因此當(dāng)HTTPServer監(jiān)聽(tīng)到有request到來(lái)時(shí),就把這個(gè)request丟給SimpleHTTPRequestHandler類(lèi)求處理;ok,了解這些之后,我們開(kāi)始分別分析下server和handler.
http之server
http模塊的設(shè)計(jì)充分利用了面向?qū)ο蟮睦^承多態(tài),因?yàn)橹坝锌戳藭?huì)tfs文件系統(tǒng)的代碼,所以再看python http時(shí),沒(méi)那么大的壓力;先給出server的繼承關(guān)系
+------------------++------------+| tcpserver基類(lèi) || BaseServer +-------->| 開(kāi)啟事件循環(huán)監(jiān)聽(tīng) |+-----+------+ | 處理客戶端請(qǐng)求 | | +------------------+ v +-----------------++------------+| httpserver基類(lèi) || TCPServer +-------->+設(shè)置監(jiān)聽(tīng)socket |+-----+------+ | 開(kāi)啟監(jiān)聽(tīng) | | +-----------------+ v+------------+| HTTPServer | +------------+
繼承關(guān)系如上圖所示,其中BaseServer和TCPServer在文件socketserver.py,HTTPServer在http/server.py;我們先看下來(lái)BaseServer;
BaseServer
因?yàn)锽aseServer是所有server的基類(lèi),因此BaseServer盡可能抽象出所有server的共性,例如開(kāi)啟事件監(jiān)聽(tīng)循環(huán),這就是每個(gè)server的共性,因此這也是BaseServer主要做的使;我們來(lái)看下BaseServer主要代碼部分
新聞熱點(diǎn)
疑難解答
圖片精選