为什么需要重定向呢?比较常见的就是当网站内部结构变动,如栏目、网址等等的变动就需要进行301重定向,还有内部一些错误的页面也可以做301重定向,提高用户体验。当因网站内部结构变动,需要删除网站中的某些目录时,这时就可以用301长久重定向到网站首页。
在tornado中,重定向有两种方法:self.redirect 和 RedirectHandler,他们通过参数permanent设置重定向是否为永久性质的
1.重定向301和302
在正式讲解tornado 重定向之前,先来了解一下重定向的基本知识。web server 返回的重定向有两种状态码,一个是301,一个是302。301 Moved Permanently 表示请求的资源已经永久的移动到新位置,而302 Found表示请求的资源现在临时从不同的URI响应请求,即这种情况是暂时的。简言之:301请求资源失效,302请求资源临时失效
不论是301还是302,浏览器都会把你带到重定向之后的网址,所以这对于我们普通用户来说,其实没有什么差别。但对于搜索引擎来说则不同,搜索引擎在爬取网络资源时,如果遇到301会把旧的网址替换为新网址,而遇到302则不会。
2.self.redirect重定向
正式使用重定向之前,先介绍下一个get请求:http://127.0.0.1:8000/?name=zhiyu&age=29。请求中,http://127.0.0.1:8000/称为域名,name和age为查询字符串,域名和查询字符串使用?连接,查询字符串之间使用&符连接
使用self.redirect进行资源重定向
# @File : redirectDemo.py
import tornado.ioloop
from tornado.httpserver import HTTPServer
from tornado.options import define, options
from tornado.web import RequestHandler, Applicationdefine('port', default=8000, help='监听端口')class HelloHandler(RequestHandler):def get(self):self.write('hello world, zhiyu')class IndexHandler(RequestHandler):def get(self):# 重定向self.redirect('/')if __name__ == '__main__':options.parse_command_line()handlers_routes = [(r'/', HelloHandler),(r'/index', IndexHandler),]app = Application(handlers_routes)http_server = HTTPServer(app)http_server.listen(options.port)tornado.ioloop.IOLoop.current().start()
在浏览器里请求http://127.0.0.1:8000/index ,你可以注意到,浏览器地址栏里最终的网址是http://127.0.0.1:8000/, 这就是redirect 的效果。
控制台结果为:
通过浏览器的开发者功能,可以查看相应信息
在响应头的首部里有一个Location,这里就是302重定向之后的地址,浏览器会根据这里的地址再次向服务器发起请求,这也就是浏览器地址栏里的地址是http://127.0.0.1:8000/的原因。
self.redirect方法有一个permanent参数,默认是False,如果设置为True,则返回的是301状态码,即永久重定向。
3.RedirectHandler重定向
这里给出使用redirecthandler的示例
import tornado.ioloop
from tornado.web import RequestHandler, Application, RedirectHandler
from tornado.httpserver import HTTPServer
from tornado.options import options, definedefine('port', default=8000, help='监听端口')class HelloHandler(RequestHandler):def get(self):self.write('hello world')if __name__ == '__main__':options.parse_command_line()handlers_routes = [(r'/', HelloHandler),(r'/index', RedirectHandler, {"url":"/"}),]app = Application(handlers=handlers_routes)http_server = HTTPServer(app)http_server.listen(options.port)tornado.ioloop.IOLoop.current().start()
查看开发者工具
同self.redirect方法相比,唯一的不同在于相应状态码是301, 使用RedirectHandler进行重定向默认是永久重定向,如果你希望它是临时重定向返回302,则设置permanent参数为False,在RedirectHandler里默认是True,刚好和self.redirect相反
handlers_routes = [(r'/', HelloHandler),(r'/index', RedirectHandler, {"url": "/", "permanent": False}),]
总而言之:
self.redirect 都是在自定义方法里使用,多是由逻辑触发(用户是否登录,请求信息变阿虎),因此多是临时性重定向,最常见的场景,当你请求一个只有登录有才能访问的功能页面时,网站都会将你重定向到登录页面,这就是临时性的重定向。
而RedirectHandler 是在每次匹配到请求 URL 时被触发,这必然是永久性重定向。