---恢復內容開始---html
Tornado 中的 get() 或 post() 方法python
Tornado 的 Web 程序會將 URL 或者 URL 範式映射到 tornado.web.RequestHandler
的子類上去。在其子類中定義了get()
或 post()
方法,用以處理不一樣的 HTTP 請求。git
下面的代碼將 URL 根目錄 /
映射到 MainHandler
,還將一個 URL 範式 /story/([0-9]+)
映射到 StoryHandler
。正則表達式匹配的分組會做爲參數引入 的相應方法中:github
class MainHandler(tornado.web.RequestHandler):
def get(self): self.write("You requested the main page") class StoryHandler(tornado.web.RequestHandler): def get(self, story_id): self.write("You requested the story " + story_id) application = tornado.web.Application([ (r"/", MainHandler), (r"/story/([0-9]+)", StoryHandler), ])
你可使用 get_argument()
方法來獲取查詢字符串參數,以及解析 POST
的內容:web
class MainHandler(tornado.web.RequestHandler): def get(self): self.write('<html><body><form action="/" method="post">' '<input type="text" name="message">' '<input type="submit" value="Submit">' '</form></body></html>') def post(self): self.set_header("Content-Type", "text/plain") self.write("You wrote " + self.get_argument("message"))
上傳的文件能夠經過 self.request.files
訪問到,該對象將名稱(HTML元素 <input type="file">
的 name 屬性)對應到一個文件列表。每個文件都以字典的形式 存在,其格式爲 {"filename":..., "content_type":..., "body":...}
。正則表達式
若是你想要返回一個錯誤信息給客戶端,例如「403 unauthorized」,只須要拋出一個 tornado.web.HTTPError
異常:app
if not self.user_is_logged_in(): raise tornado.web.HTTPError(403)
請求處理程序能夠經過 self.request
訪問到表明當前請求的對象。該 HTTPRequest
對象包含了一些有用的屬性,包括:函數
arguments
- 全部的 GET
或 POST
的參數files
- 全部經過 multipart/form-data
POST 請求上傳的文件path
- 請求的路徑( ?
以前的全部內容)headers
- 請求的開頭信息你能夠經過查看源代碼 httpserver
模組中 HTTPRequest
的定義,從而瞭解到它的 全部屬性。tornado
除了 get()
/post()
等之外,RequestHandler
中的一些別的方法函數,這都是 一些空函數,它們存在的目的是在必要時在子類中從新定義其內容。對於一個請求的處理 的代碼調用次序以下:post
initialize()
函數,這個函數的參數是 Application
配置中的關鍵字 參數定義。(initialize
方法是 Tornado 1.1 中新添加的,舊版本中你須要 重寫 __init__
以達到一樣的目的) initialize
方法通常只是把傳入的參數存 到成員變量中,而不會產生一些輸出或者調用像 send_error
之類的方法。prepare()
。不管使用了哪一種 HTTP 方法,prepare
都會被調用到,所以 這個方法一般會被定義在一個基類中,而後在子類中重用。prepare能夠產生輸出 信息。若是它調用了
finish(或
send_error` 等函數),那麼整個處理流程 就此結束。get()
、post()
、put()
等。若是 URL 的正則表達式模式中有分組匹配,那麼相關匹配會做爲參數傳入方法。下面是一個示範 initialize()
方法的例子:
class ProfileHandler(RequestHandler):
def initialize(self, database): self.database = database def get(self, username): ... app = Application([ (r'/user/(.*)', ProfileHandler, dict(database=database)), ])
其它設計用來被複寫的方法有:
get_error_html(self, status_code, exception=None, **kwargs)
- 以字符串的形式 返回 HTML,以供錯誤頁面使用。get_current_user(self)
- 查看下面的用戶認證一節get_user_locale(self)
- 返回 locale
對象,以供當前用戶使用。get_login_url(self)
- 返回登陸網址,以供 @authenticated
裝飾器使用(默認位置 在 Application
設置中)get_template_path(self)
- 返回模板文件的路徑(默認是 Application
中的設置)Tornado 中的重定向有兩種主要方法:self.redirect
,或者使用 RedirectHandler
。
你能夠在使用 RequestHandler
(例如 get
)的方法中使用 self.redirect
,將用戶 重定向到別的地方。另外還有一個可選參數 permanent
,你能夠用它指定此次操做爲永久性重定向。
該參數會激發一個 301 Moved Permanently
HTTP 狀態,這在某些狀況下是有用的, 例如,你要將頁面的原始連接重定向時,這種方式會更有利於搜索引擎優化(SEO)。
permanent
的默認值是 False
,這是爲了適用於常見的操做,例如用戶端在成功發送 POST 請求 之後的重定向。
self.redirect('/some-canonical-page', permanent=True)
RedirectHandler
會在你初始化 Application
時自動生成。
例如本站的下載 URL,由較短的 URL 重定向到較長的 URL 的方式是這樣的:
application = tornado.wsgi.WSGIApplication([ (r"/([a-z]*)", ContentHandler), (r"/static/tornado-0.2.tar.gz", tornado.web.RedirectHandler, dict(url="http://github.com/downloads/facebook/tornado/tornado-0.2.tar.gz")), ], **settings)
RedirectHandler
的默認狀態碼是 301 Moved Permanently
,不過若是你想使用 302 Found
狀態碼,你須要將permanent
設置爲 False
。
application = tornado.wsgi.WSGIApplication([ (r"/foo", tornado.web.RedirectHandler, {"url":"/bar", "permanent":False}), ], **settings)
注意,在 self.redirect
和 RedirectHandler
中,permanent
的默認值是不一樣的。 這樣作是有必定道理的,self.redirect
一般會被用在自定義方法中,是由邏輯事件觸發 的(例如環境變動、用戶認證、以及表單提交)。而 RedirectHandler
是在每次匹配到請求 URL 時被觸發。
---恢復內容結束---