「重定向」指的是HTTP重定向,是HTTP協議的一種機制。當client向server發送一個請求,要求獲取一個資源時,在server接收到這個請求後發現請求的這個資源實際存放在另外一個位置,因而server在返回的response中寫入那個請求資源的正確的URL,並設置reponse的狀態碼爲301(永久)或者 302(暫時),當client接受到這個response後就會根據新的URL從新發起請求。重定向有一個典型的特症,即,當一個請求被重定向之後,最終瀏覽器上顯示的URL每每再也不是開始時請求的那個URL了。這就是重定向的由來。web
下面咱們先看Redirect的源碼,以後分析完源碼後能夠更好的理解其用法。正則表達式
在 web.py 中發現有倆個地方實現了重定向的機制:瀏覽器
1 def redirect(self, url, permanent=False, status=None): 2 if self._headers_written: 3 raise Exception("Cannot redirect after headers have been written") 4 if status is None: 5 status = 301 if permanent else 302
6 else: 7 assert isinstance(status, int) and 300 <= status <= 399
8 self.set_status(status) 9 self.set_header("Location", utf8(url)) 10 self.finish()
先看傳入進來的參數:網絡
注: 默認值爲302。app
分析:函數
1 class RedirectHandler(RequestHandler): 2 def initialize(self, url, permanent=True): 3 self._url = url 4 self._permanent = permanent 5 6 def get(self, *args): 7 self.redirect(self._url.format(*args), permanent=self._permanent)
介紹和用法:源碼分析
1 application = web.Application([ 2 (r"/oldpath", web.RedirectHandler, {"url": "/newpath"}), 3 ])
在Application中調用該 RedirectHandlerf方法,給定參數「url」,其會將 地址’/oldpath‘ 重定向到 ’/newpath‘ 中。url
1 application = web.Application([ 2 (r"/(.*?)/(.*?)/(.*)", web.RedirectHandler, {"url": "/{1}/{0}/{2}"}), 3 ])
最終的URL可使用格式化方法: str.format,子串會被捕獲而後進行對應的匹配。在上面的例子中,一個 「a/b/c」 的請求可以被格式化,以下: spa
str.format("/{1}/{0}/{2}", "a", "b", "c") # -> "/b/a/c"
源碼分析:code
對於兩種方法中的 permanent 參數,類 RedirectHandler 中默認爲True(永久性重定向301);self.redirect中默認爲False(臨時性重定向302);
緣由:self.redirect 多數狀況下被用於用戶自定義的狀況下進行重定向操做(例如環境變動、用戶認證、以及表單提交),因此其默認爲臨時的重定向。類RedirectHandler 是每次匹配到該請求URL的時候就觸發重定向。