本系列博文計劃:
1接剩、剖析基于Python的Web框架Tornado的源碼皆警,為何要閱讀源碼枣氧?
Tornado 由前 google 員工開發(fā)溢十,代碼非常精練,實現(xiàn)也很輕巧达吞,加上清晰的注釋和豐富的 demo张弛,我們可以很容易的閱讀分析 tornado. 通過閱讀 Tornado 的源碼,你將學到:
理解 Tornado 的內(nèi)部實現(xiàn)酪劫,使用 tornado 進行 web 開發(fā)將更加得心應(yīng)手吞鸭。
如何實現(xiàn)一個高性能,非阻塞的 http 服務(wù)器覆糟。
如何實現(xiàn)一個 web 框架刻剥。
各種網(wǎng)絡(luò)編程的知識,比如 epoll
python 編程的絕佳實踐
視頻分享鏈接:
https://study.163.com/course/introduction/1209485881.htm?share=2&shareId=400000000535031
https://study.163.com/course/introduction/1209407824.htm?share=2&shareId=400000000535031
https://study.163.com/course/introduction/1209401891.htm?share=2&shareId=400000000535031
在tornado的子目錄中滩字,每個模塊都應(yīng)該有一個.py文件造虏,你可以通過檢查他們來判斷你是否從已經(jīng)從代碼倉庫中完整的遷出了項目御吞。在每個源代碼的文件中,你都可以發(fā)現(xiàn)至少一個大段落的用來解釋該模塊的doc string漓藕,doc string中給出了一到兩個關(guān)于如何使用該模塊的例子陶珠。
2、為Python開發(fā)一個完善的MVC框架
首先將帶著大家一起來剖析基于python編寫的Web框架 tornado 享钞,本著易讀易懂的目標來寫這一系列揍诽,寄希讓小白也能zeng明白其中的道理,與其說剖析還不如說是白話栗竖,因為本系列都會用通俗的語言去描述Web框架中的各個知識點寝姿。
概述
Tornado?是?FriendFeed?使用的可擴展的非阻塞式 web 服務(wù)器及其相關(guān)工具的開源版本。這個 Web 框架看起來有些像web.py?或者?Google 的 webapp划滋,不過為了能有效利用非阻塞式服務(wù)器環(huán)境,這個 Web 框架還包含了一些相關(guān)的有用工具 和優(yōu)化埃篓。
Tornado 和現(xiàn)在的主流 Web 服務(wù)器框架(包括大多數(shù) Python 的框架)有著明顯的區(qū)別:它是非阻塞式服務(wù)器处坪,而且速度相當快。得利于其 非阻塞的方式和對epoll的運用架专,Tornado 每秒可以處理數(shù)以千計的連接同窘,這意味著對于實時 Web 服務(wù)來說,Tornado 是一個理想的 Web 框架部脚。我們開發(fā)這個 Web 服務(wù)器的主要目的就是為了處理 FriendFeed 的實時功能 ——在 FriendFeed 的應(yīng)用里每一個活動用戶都會保持著一個服務(wù)器連接想邦。(關(guān)于如何擴容 服務(wù)器,以處理數(shù)以千計的客戶端的連接的問題委刘,請參閱C10K problem丧没。)
下載安裝:
1
2
3
pip3 install tornado
源碼安裝
https://pypi.python.org/packages/source/t/tornado/tornado-4.3.tar.gz
Tornado模塊分類
1. Core web framework
tornado.web — 包含web框架的大部分主要功能,包含RequestHandler和Application兩個重要的類
tornado.httpserver — 一個無阻塞HTTP服務(wù)器的實現(xiàn)
tornado.template — 模版系統(tǒng)
tornado.escape — HTML,JSON,URLs等的編碼解碼和一些字符串操作
tornado.locale — 國際化支持
2. Asynchronous networking 底層模塊
tornado.ioloop — 核心的I/O循環(huán)
tornado.iostream — 對非阻塞式的 socket 的簡單封裝锡移,以方便常用讀寫操作
tornado.httpclient — 一個無阻塞的HTTP服務(wù)器實現(xiàn)
tornado.netutil — 一些網(wǎng)絡(luò)應(yīng)用的實現(xiàn)呕童,主要實現(xiàn)TCPServer類
3. Integration with other services
tornado.auth — 使用OpenId和OAuth進行第三方登錄
tornado.database — 簡單的MySQL服務(wù)端封裝
tornado.platform.twisted — 在Tornado上運行為Twisted實現(xiàn)的代碼
tornado.websocket — 實現(xiàn)和瀏覽器的雙向通信
tornado.wsgi — 與其他python網(wǎng)絡(luò)框架/服務(wù)器的相互操作
4. Utilities
tornado.autoreload — 生產(chǎn)環(huán)境中自動檢查代碼更新
tornado.gen — 一個基于生成器的接口,使用該模塊保證代碼異步運行
tornado.httputil — 分析HTTP請求內(nèi)容
tornado.options — 解析終端參數(shù)
tornado.process — 多進程實現(xiàn)的封裝
tornado.stack_context — 用于異步環(huán)境中對回調(diào)函數(shù)的上下文保存淆珊、異常處理
tornado.testing — 單元測試
框架使用
寫一個hello,world:
?
?
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import tornado.ioloop
import tornado.web
class MainHandler(tornado.web.RequestHandler):
? ? def get(self):
? ? ? ? self.write("Hello, world")
application = tornado.web.Application([
? ? (r"/index", MainHandler),
])
if __name__ == "__main__":
? ? application.listen(8888)
? ? tornado.ioloop.IOLoop.instance().start()
?
第一步:執(zhí)行腳本夺饲,監(jiān)聽 8888 端口
第二步:瀏覽器客戶端訪問 /index ?--> ?http://127.0.0.1:8888/index
第三步:服務(wù)器接受請求,并交由對應(yīng)的類處理該請求
第四步:類接受到請求之后施符,根據(jù)請求方式(post / get / delete ...)的不同調(diào)用并執(zhí)行相應(yīng)的方法
第五步:方法返回值的字符串內(nèi)容發(fā)送瀏覽器
由上述分析往声,我們將整個Web框架分為兩大部分:
待請求階段,即:創(chuàng)建服務(wù)端socket并監(jiān)聽端口
處理請求階段戳吝,即:當有客戶端連接時浩销,接受請求,并根據(jù)請求的不同做出相應(yīng)的相應(yīng)
那么在記下來的博文中將按照這兩種分類來進行剖析...