第5节,tornado 重定向

在tornado中,重定向有两种方法:self.redirect 和 RedirectHandler,他们通过参数permanent设置重定向是否为永久性质的。

1. 重定向301与302

在正式讲解tornado 重定向之前,先来了解一下重定向的基本知识。web server 返回的重定向有两种状态码,一个是301,一个是302。301 Moved Permanently 表示请求的资源已经永久的移动到新位置,而302 Found表示请求的资源现在临时从不同的URI响应请求,即这种情况是暂时的。

不论是301还是302,浏览器都会把你带到重定向之后的网址,所以这对于我们普通用户来说,其实没有什么差别。但对于搜索引擎来说则不同,搜索引擎在爬取网络资源时,如果遇到301会把旧的网址替换为新网址,而遇到302则不会。

2. self.redirect

下面是使用self.redirect进行重定向的例子

import tornado.ioloop
from tornado.web import RequestHandler, Application
from tornado.httpserver import HTTPServer
from tornado.options import options, define

define('port', default=8000, help='监听端口')


class HelloHandler(RequestHandler):
    def get(self):
        self.write('hello world')

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=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 的效果。通过浏览器的开发者功能,可以查看相应信息

tornado 重定向

在响应头的首部里有一个Location,这里就是302重定向之后的地址,浏览器会根据这里的地址再次xiang向服务器发起请求,这也就是浏览器地址栏里的地址是http://127.0.0.1:8000/的原因。

self.redirect方法有一个permanent参数,默认是False,如果设置为True,则返回的是301状态码,即永久重定向。

3. RedirectHandler

下面是tornado 使用RedirectHandler 进行重定向的例子

import tornado.ioloop
from tornado.web import RequestHandler, Application, RedirectHandler
from tornado.httpserver import HTTPServer
from tornado.options import options, define

define('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()

通过浏览器的开发者工具查看相应信息
tornado 重定向

同self.redirect方法相比,唯一的不同在于相应状态码是301, 使用RedirectHandler进行重定向默认是永久重定向,如果你希望它是临时重定向返回302,则设置permanent参数为False,在RedirectHandler里默认是True,刚好和self.redirect相反

 handlers_routes = [
        (r'/', HelloHandler),
        (r'/index', RedirectHandler, {"url": "/", "permanent": False}),
    ]

4. 总结

self.redirect 都是在自定义方法里使用,多是由逻辑触发(用户是否登录,请求信息变阿虎),因此多是临时性重定向,最常见的场景,当你请求一个只有登录有才能访问的功能页面时,网站都会将你重定向到登录页面,这就是临时性的重定向。

而RedirectHandler 是在每次匹配到请求 URL 时被触发,这必然是永久性重定向。

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案