tornado web 應用程序一般包含一個或者多個RequestHandler 子類,一個Application 對象來爲每一個控制器路由到達的請求和一個mian()函數html
import tornado.ioloop import tornado.web class MainHandler(tornado.web.RequestHandler): def get(self): self.write("Hello, world") def make_app(): return tornado.web.Application([ (r"/", MainHandler), ]) if __name__ == "__main__": app = make_app() app.listen(8888) tornado.ioloop.IOLoop.current().start()
Application 對象python
Application 對象是負責全局的設置,包括用來轉發請求和控制器的路由表web
路由表是一些的url對象,其中包括正則,參數等,若是一個字典當作url被傳遞到第三個參數中時,它將做爲初始參數傳遞給RequestHandler.initialize 最後url可能會有一個名字容許和RequestHandler.reverse_url 一塊兒使用正則表達式
RequestHandler 子類json
大多數tornado.web 應用程序的工做都是在RequestHandler子類中完成的,對於一個控制器子類來講主入口點被get()和post()等這個的HTTP方法控制着api
許多RequestHandler.render 或者RequestHandler.write 將會產生一個相應的render(),經過名字做爲參數加載Template.write(),將產生一個不適用模本的純輸出,它接收字符串,字節系列和字典等app
許多RequestHandler中的方法被設計成爲可以在子類中覆蓋方法以在整個應用程序中使用,一般定義BaseHandler類來覆蓋writ.error 和get_current_user 而後繼承時,使用的是BaseHandler異步
處理輸入請求async
處理輸入請求能夠用self.requestide
經過 HTML 表單形式的數據能夠利用 get_query_argument
和 get_body_argument
等方法來轉換
RequestHandler
能夠明確的聲明想要的是一個值仍是一個列表. 對於列表來講, 使用 get_query_arguments
和 get_body_arguments
經過 self.request.files
能夠實現文件上傳
因爲 HTML 的編碼形式十分古怪 (例如. 不區分單一參數仍是列表參數), Tornado 不會試圖去統一這些參數. 特別的, 咱們不會解析 JSON 請求的請求體. 應用程序但願使用 JSON 在編碼上代替prepare
來解析它們的請求:
def prepare(self): if self.request.headers["Content-Type"].startswith("application/json"): self.json_args = json.loads(self.request.body) else: self.json_args = None
initialize()
在 Application
的初始化配置參數下被調用. initialize
一般只保存成員變量傳遞的參數; 它將不會產生任何輸出或者調用像 send_error
同樣的方法.prepare()
被調用. 這時基類在與子類共享中最有用的一個方法, 不管是否使用了 HTTP 方法prepare
都將會被調用. prepare
可能會產生輸出; 若是她調用了 finish
(或者 redirect
, 等等), 處理會在這終止.get()
, post()
, put()
, 等等. 若是 URL 正則表達式中包含匹配組, 它們將被傳遞當這些方法的參數中.on_finish()
. 對於同步處理來講調用會在 get()
(等) 返回後當即執行; 對於異步處理來講這將會發生在調用 finish()
以後.全部像這樣能夠被覆蓋的方法都記錄在 RequestHandler
的文檔中. 其中一些最經常使用的覆蓋方法有:
write_error
- 輸出一個HTML的出錯信息on_connection_close
- 當與客戶端斷開時會被調用; 應用程序將會檢查這種狀況而且中止後續的處理. 要注意這裏沒法保證客戶端斷開時能夠馬上被檢測到.get_current_user
- 詳見 用戶認證get_user_locale
- 給當前用戶返回一個 Locale
對象set_default_headers
- 能夠用來設置 在迴應時的附加首部 (例如能夠定製 Server
首部)
在 Tornado 中重定向有兩種重要的方式: RequestHandler.redirect
和利用 RedirectHandler
.
你能夠在 RequestHandler
中使用 self.redirect()
把用戶重定向到其它地方. 可選參數 permanent
能夠定義這個跳轉是否時永久的.
RedirectHandler
能夠在你的 Application
路由表中直接設置跳轉. 例如, 設置一條靜態跳轉:
app = tornado.web.Application([ url(r"/app", tornado.web.RedirectHandler, dict(url="http://itunes.apple.com/my-app-id")), ])
使用異步處理程序的最簡單方式是使用 coroutine
修飾符. 這將會容許你經過關鍵字 yield
生成一個 非阻塞 I/O,
在某些時候, 協程可能不如一些基於回調的方式更方便, 在這些狀況下 tornado.web.asynchronous
修飾符能夠被取代. 這個修飾符一般不會自動發送應答; 相反請求將會被保持直到有些回調函數調用RequestHandler.finish
. 這取決於應用程序來保證方法是會被掉用的, 不然用戶的請求將會被簡單的掛起.
c
class MainHandler(tornado.web.RequestHandler): @tornado.web.asynchronous def get(self): http = tornado.httpclient.AsyncHTTPClient() http.fetch("http://friendfeed-api.com/v2/feed/bret", callback=self.on_response) def on_response(self, response): if response.error: raise tornado.web.HTTPError(500) json = tornado.escape.json_decode(response.body) self.write("Fetched " + str(len(json["entries"])) + " entries " "from the FriendFeed API") self.finish()
參考http://tornado-zh-cn.readthedocs.io/zh_CN/latest/guide/structure.html