标签:指定 地方 交换 就会 blog nis 临时性 head font
“重定向”指的是HTTP重定向,是HTTP协议的一种机制。当client向server发送一个请求,要求获取一个资源时,在server接收到这个请求后发现请求的这个资源实际存放在另一个位置,于是server在返回的response中写入那个请求资源的正确的URL,并设置reponse的状态码为301(永久)或者 302(暂时),当client接受到这个response后就会根据新的URL重新发起请求。重定向有一个典型的特症,即,当一个请求被重定向以后,最终浏览器上显示的URL往往不再是开始时请求的那个URL了。这就是重定向的由来。
下面我们先看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。
分析:
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‘ 中。
1 application = web.Application([
2 (r"/(.*?)/(.*?)/(.*)", web.RedirectHandler, {"url": "/{1}/{0}/{2}"}),
3 ])
最终的URL可以使用格式化方法: str.format,子串会被捕获然后进行对应的匹配。在上面的例子中,一个 “a/b/c” 的请求能够被格式化,如下:
str.format("/{1}/{0}/{2}", "a", "b", "c") # -> "/b/a/c"
源码分析:
对于两种方法中的 permanent 参数,类 RedirectHandler 中默认为True(永久性重定向301);self.redirect中默认为False(临时性重定向302);
原因:self.redirect 多数情况下被用于用户自定义的情况下进行重定向操作(例如环境变更、用户认证、以及表单提交),所以其默认为临时的重定向。类RedirectHandler 是每次匹配到该请求URL的时候就触发重定向。
标签:指定 地方 交换 就会 blog nis 临时性 head font
原文地址:http://www.cnblogs.com/ShaunChen/p/6652567.html