Tornado 中的 get() 或 post() 方法


---恢復內容開始---

Tornado 中的 get() 或 post() 方法

請求處理程序和請求參數

Tornado 的 Web 程序會將 URL 或者 URL 范式映射到 tornado.web.RequestHandler 的子類上去。在其子類中定義了get() 或 post() 方法,用以處理不同的 HTTP 請求。

下面的代碼將 URL 根目錄 / 映射到 MainHandler,還將一個 URL 范式 /story/([0-9]+) 映射到 StoryHandler。正則表達式匹配的分組會作為參數引入 的相應方法中:

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 的內容:

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 異常:

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 的定義,從而了解到它的 所有屬性。

重寫 RequestHandler 的方法函數

除了 get()/post()等以外,RequestHandler 中的一些別的方法函數,這都是 一些空函數,它們存在的目的是在必要時在子類中重新定義其內容。對於一個請求的處理 的代碼調用次序如下:

  1. 程序為每一個請求創建一個 RequestHandler 對象
  2. 程序調用 initialize() 函數,這個函數的參數是 Application 配置中的關鍵字 參數定義。(initialize 方法是 Tornado 1.1 中新添加的,舊版本中你需要 重寫 __init__ 以達到同樣的目的) initialize 方法一般只是把傳入的參數存 到成員變量中,而不會產生一些輸出或者調用像 send_error 之類的方法。
  3. 程序調用 prepare()。無論使用了哪種 HTTP 方法,prepare 都會被調用到,因此 這個方法通常會被定義在一個基類中,然后在子類中重用。prepare可以產生輸出 信息。如果它調用了finish(或send_error` 等函數),那么整個處理流程 就此結束。
  4. 程序調用某個 HTTP 方法:例如 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 中的設置)

重定向(redirect)

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 時被觸發。

 

---恢復內容結束---


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM