用python写王字_看这里!Python之web之王!
Tornado是使用Python編寫的一個強大的、可擴(kuò)展的Web服務(wù)器。它在處理嚴(yán)峻的網(wǎng)絡(luò)流量時表現(xiàn)得足夠強健,但卻在創(chuàng)建和編寫時有著足夠的輕量級,并能夠被用在大量的應(yīng)用和工具中。
Tornado與現(xiàn)代主流的Web服務(wù)器框架有著明顯的區(qū)別:它是多進(jìn)程非阻塞式的服務(wù)器,速度相當(dāng)快。這得益于其非阻塞的方式和對epoll的運用。Tornado每秒可以處理數(shù)以千計的連接,對于實時Web服務(wù)來說Tornado確實是一個理想的Web框架。
優(yōu)勢:
輕量級web框架
異步非阻塞IO處理方式
出色的抗負(fù)載能力
優(yōu)異的處理性能,不依賴多進(jìn)程/多線程,一定程度上解決C10K問題
WSGI全棧替代產(chǎn)品,推薦同時使用其web框架和HTTP服務(wù)器
結(jié)構(gòu):
Web框架
主要包括RequestHandler用于創(chuàng)建Web應(yīng)用程序和各種支持類的子類
HTTP服務(wù)器與客戶端
主要包括HTTPServer和AsyncHTTPClient
異步網(wǎng)絡(luò)庫
主要包括IOLoop和IOStream作為HTTP組件的構(gòu)建塊
協(xié)程庫
模塊:
核心Web框架tornado.web包括Web框架大部分主要功能,包括RequestHandler和Application類。
tornado.httpserver一個無阻塞HTTP服務(wù)器的實現(xiàn)
tornado.template模板系統(tǒng)
tornado.escapeHTML、JSON、URLs等編碼解碼和字符串操作
tornado.locale國際化支持
異步網(wǎng)絡(luò)底層模塊tornado.ioloop核心IO循環(huán)
tornado.iostream對非阻塞的Socket的簡單封裝以方便常用讀寫操作
tornado.httpclient無阻塞的HTTP服務(wù)器實現(xiàn)
tornado.netutil網(wǎng)絡(luò)應(yīng)用的實現(xiàn)主要是TCPServer類
系統(tǒng)集成服務(wù)tornado.auth使用OpenId和OAuth進(jìn)行第三方登錄
tornado.databaseMySQL服務(wù)端封裝
tornado.platform.twisted在Tornado上運行Twisted實現(xiàn)的代碼
tornado.websocket實現(xiàn)和瀏覽器的雙向通信
tornado.wsgi其他Python網(wǎng)絡(luò)框架或服務(wù)器的相互操作
應(yīng)用模塊tornado.autoload產(chǎn)生環(huán)境中自動檢查代碼更新
tornado.gen基于生成器的接口,使用該模塊保證代碼異步運行。
tornado.httputil分析HTTP請求內(nèi)容
tornado.options解析終端參數(shù)
tornado.process多進(jìn)程實現(xiàn)的封裝
tornado.stack_context異步環(huán)境中對回調(diào)函數(shù)上下文保存、異常處理
tornado.testing單元測試
Tornado服務(wù)器的三個底層核心模塊
1、httpserver服務(wù)于web模塊的一個簡單的HTTP服務(wù)器的實現(xiàn)
Tornado的HTTPConnection類用來處理HTTP請求,包括讀取HTTP請求頭、讀取POST傳遞的數(shù)據(jù),調(diào)用用戶自定義的處理方法,以及把響應(yīng)數(shù)據(jù)寫給客戶端的socket。
2、iostream對非阻塞式的socket的封裝以便于常見讀寫操作
為了在處理請求時實現(xiàn)對socket的異步讀寫,Tornado實現(xiàn)了IOStream類用來處理socket的異步讀寫。
3、ioloop核心的I/O循環(huán)
Tornado為了實現(xiàn)高并發(fā)和高性能,使用了一個IOLoop事件循環(huán)來處理socket的讀寫事件,IOLoop事件循環(huán)是基于Linux的epoll模型,可以高效地響應(yīng)網(wǎng)絡(luò)事件,這是Tornado高效的基礎(chǔ)保證。
核心模塊關(guān)系與請求流程
設(shè)計模型:
Tornado不僅僅是一個Web框架,它完整地實現(xiàn)了HTTP服務(wù)器和客戶端,在此基礎(chǔ)上提供了Web服務(wù),它可分為四層:
1、Web框架:最上層,包括處理器、模板、數(shù)據(jù)庫連接、認(rèn)證、本地化等Web框架所需功能。
2、HTTP/HTTPS層:基于HTTP協(xié)議實現(xiàn)了HTTP服務(wù)器和客戶端
3、TCP層:實現(xiàn)TCP服務(wù)器負(fù)責(zé)數(shù)據(jù)傳輸
4、Event層:最底層、處理IO事件
設(shè)計模型
Tornado是一個編寫對HTTP請求響應(yīng)的框架。作為程序員,你的工作是編寫響應(yīng)特定條件HTTP請求的響應(yīng)的handler。下面是一個全功能的Tornado應(yīng)用的基礎(chǔ)示例:
wcp_tornado.py
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
from tornado.options import define, options
define('port', default=8000, help='run on the given port', type=int)
class Indexfun(tornado.web.RequestHandler):
def get(self):
name = self.get_argument('v1','v2')
self.write('hello, ' + name)
if __name__ == '__main__':
tornado.options.parse_command_line()
app = tornado.web.Application(handlers=[(r"/", Indexfun)])
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.current().start()
讓我們把這個例子分成小塊,逐步分析它們:
importtornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
from tornado.options import define, options
define('port', default=8000, help='run on the given port', type=int)
程序頂部導(dǎo)入了tornado下的模塊,而且使用了tornado.options從命令行讀取設(shè)置,如果執(zhí)行命令行沒有設(shè)置port參數(shù),則使用默認(rèn)值進(jìn)行替代,而且格式要與type設(shè)置的格式相同。
classIndexfun(tornado.web.RequestHandler):
def get(self):
定義了一個tornado的請求處理函數(shù)類Indexfun,當(dāng)處理一個請求時,Tornado將這個類實例化,并調(diào)用與HTTP請求方法所對應(yīng)的方法。在這個例子中,我們只定義了一個get方法,也就是說這個處理函數(shù)將對HTTP的GET請求作出響應(yīng)。我們稍后將看到實現(xiàn)不止一個HTTP方法的處理函數(shù)。
name = self.get_argument('v1','v2')
Tornado的RequestHandler類有一系列有用的內(nèi)建方法,包括get_argument,我們在這里從一個查詢字符串中取得參數(shù)greeting的值。如果這個參數(shù)沒有出現(xiàn)在get請求的url中,Tornado將使用get_argument的第二個參數(shù)作為默認(rèn)值。
self.write('hello, ' + name)
RequestHandler的另一個有用的方法是write,它以一個字符串作為函數(shù)的參數(shù),并將其寫入到HTTP響應(yīng)中。在這里,我們使用請求中g(shù)reeting參數(shù)提供的值插入到greeting中,并寫回到響應(yīng)中。
if __name__ == '__main__':
tornado.options.parse_command_line()
app = tornado.web.Application(handlers=[(r"/", Indexfun)])
這是真正使得Tornado運轉(zhuǎn)起來的語句。首先,我們使用Tornado的options模塊來解析命令行。然后我們創(chuàng)建了一個Tornado的Application類的實例。傳遞給Application類init方法的最重要的參數(shù)是handlers。它告訴Tornado應(yīng)該用哪個類來響應(yīng)請求。
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()
從這里開始的代碼將會被反復(fù)使用:一旦Application對象app被創(chuàng)建,我們可以將其傳遞給Tornado的HTTPServer對象,然后使用我們在命令行指定的端口進(jìn)行監(jiān)聽(通過options.port取出。)最后,在程序準(zhǔn)備好接收HTTP請求后,我們創(chuàng)建一個Tornado的IOLoop的實例。
注意:tornado5.0之后的版本,instance()已經(jīng)成為current()的別稱,即就是調(diào)用instance方法時,實際上調(diào)用的是current方法。
再看一眼wcp_tornado.py中的這一行:
app = tornado.web.Application(handlers=[(r"/", Indexfun)])
這個handlers參數(shù)很重要,它應(yīng)該是一個元組組成的列表,其中每個元組的第一個元素是一個匹配HTTP請求的路徑的正則表達(dá)式,這個路徑是URL中主機(jī)名后面的部分,不包括查詢的參數(shù)。,第二個元素是一個RequestHanlder類,也就是我們編寫的響應(yīng)請求的視圖函數(shù)類。在wcp_tornado.py中,我們只指定了一個正則表達(dá)式-RequestHanlder對,但你可以按你的需要指定任意多個。
總結(jié)
以上是生活随笔為你收集整理的用python写王字_看这里!Python之web之王!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab截视频人脸,一种视频图像中人
- 下一篇: PDF转word之后的结果事图片格式,如