Python Tornado入門:Hello Tornado
Why Tornado?
在過去的五年裡,Web開發人員的可用工具實現了跨越式地增長。當技術專家不斷推動極限,使Web應用無處不在時,我們也不得不升級我們的工具、建立框架以保證構建更好的應用。我們希望能夠使用新的工具,方便我們寫出更加整潔、可維護的程式碼,使部署到世界各地的使用者時擁有高效的可擴充套件性。
這就讓我們談論到Tornado,一個編寫易建立、擴充套件和部署的強力Web應用的夢幻選擇。我們三個都因為Tornado的速度、簡單和可擴充套件性而深深地愛上了它,在一些個人專案中嘗試之後,我們將其運用到日常工作中。我們已經看到,Tornado在很多大型或小型的專案中提升了開發者的速度(和樂趣!),同時,其魯棒性和輕量級也給開發者一次又一次留下了深刻的印象。
Install Tornado!
安裝有多難?一個命令搞定,無需多餘配置。
pip install tornado
《Hello Tornado》
Tornado是一個編寫對HTTP請求響應的框架。作為程式設計師,你的工作是編寫響應特定條件HTTP請求的響應的handler。下面是一個全功能的Tornado應用的基礎示例:
基本程式碼
# coding:utf-8 import tornado.httpserver import tornado.ioloop import tornado.options import tornado.web from tornado.options import define, options define("port", default=3333, help="run on the given port", type=int) class IndexHandler(tornado.web.RequestHandler): def get(self): username = self.get_argument('username', 'Hello') self.write(username + ', Administrator User!') if __name__ == "__main__": tornado.options.parse_command_line() app = tornado.web.Application(handlers=[(r"/", IndexHandler)]) http_server = tornado.httpserver.HTTPServer(app) http_server.listen(options.port) tornado.ioloop.IOLoop.instance().start()
執行Tornado
python hello.py --port=3333
訪問Tornado
在瀏覽器中開啟http://localhost:3333
即可訪問成功。
又或者開啟另一個終端視窗使用curl訪問
$ curl http://localhost:3333/
Hello, Administrator User!
$ curl http://localhost:3333/?username=blog.csdn.net/moshowgame
blog.csdn.net/moshowgame, Administrator User!
程式碼解析
from tornado.options import define, options define(“port”,
default=8000, help=“run on the given port”, type=int)
在程式的最頂部,我們匯入了一些Tornado模組。雖然Tornado還有另外一些有用的模組,但在這個例子中我們必須至少包含這四個模組。
Tornado包括了一個有用的模組(tornado.options)來從命令列中讀取設定。我們在這裡使用這個模組指定我們的應用監聽HTTP請求的埠。它的工作流程如下:如果一個與define語句中同名的設定在命令列中被給出,那麼它將成為全域性options的一個屬性。如果使用者執行程式時使用了–help選項,程式將打印出所有你定義的選項以及你在define函式的help引數中指定的文字。
如果使用者沒有為這個選項指定值,則使用default的值進行代替。Tornado使用type引數進行基本的引數型別驗證,當不合適的型別被給出時丟擲一個異常。因此,我們允許一個整數的port引數作為options.port來訪問程式。如果使用者沒有指定值python hello.py --port=3333
,則預設為8000。
class IndexHandler(tornado.web.RequestHandler):
def get(self):
username = self.get_argument(‘username’, ‘Hello’)
self.write(username + ‘, Administrator User!’)
這是Tornado的Handler請求處理函式類
。當處理一個請求時,Tornado將這個類例項化,並呼叫與HTTP請求方法所對應的方法。在這個例子中,我們只定義了一個get方法,也就是說這個處理函式將對HTTP的GET請求
作出響應。
greeting = self.get_argument(’
username
’, ‘Hello’)
Tornado的RequestHandler類有一系列有用的內建方法,包括get_argument
,我們在這裡從一個查詢字串中取得引數username
的值。(如果這個引數沒有出現在查詢字串中,Tornado將使用get_argument的第二個引數作為預設值。)
self.write(username + ‘, Administrator User!’)
RequestHandler的另一個有用的方法是write
,它以一個字串作為函式的引數,並將其寫入到HTTP響應中。在這裡,我們使用請求中username引數
提供的值繫結到username變數
中,並寫回到響應中。
if name == “main”:
tornado.options.parse_command_line()
app = tornado.web.Application(handlers=[(r"/", IndexHandler)])
這是真正使得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物件被建立,我們可以將其傳遞給Tornado的HTTPServer
物件,然後使用我們在命令列指定的埠進行監聽(通過options物件取出。)最後,在程式準備好接收HTTP請求後,我們建立一個Tornado
的IOLoop
的例項。