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