tornado web應用程序結構

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

覆蓋 RequestHandler 的方法

  

  1. initialize() 在 Application 的初始化配置參數下被調用. initialize 一般只保存成員變量傳遞的參數; 它將不會產生任何輸出或者調用像 send_error 同樣的方法.
  2. prepare() 被調用. 這時基類在與子類共享中最有用的一個方法, 不管是否使用了 HTTP 方法prepare 都將會被調用. prepare 可能會產生輸出; 若是她調用了 finish (或者 redirect, 等等), 處理會在這終止.
  3. HTTP方法將會被調用: get()post()put(), 等等. 若是 URL 正則表達式中包含匹配組, 它們將被傳遞當這些方法的參數中.
  4. 當這些請求結束之後, 會調用 on_finish() . 對於同步處理來講調用會在 get() (等) 返回後當即執行; 對於異步處理來講這將會發生在調用 finish() 以後.

全部像這樣能夠被覆蓋的方法都記錄在 RequestHandler 的文檔中. 其中一些最經常使用的覆蓋方法有:

重定向

 

  

在 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

相關文章
相關標籤/搜索