1. 程式人生 > >Python Tornado入門:Hello Tornado

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請求後,我們建立一個TornadoIOLoop的例項。