Tornado重定向(三)

为什么需要重定向呢?比较常见的就是当网站内部结构变动,如栏目、网址等等的变动就需要进行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, Application

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

查看开发者工具
在这里插入图片描述
同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 时被触发,这必然是永久性重定向。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Tornado一个Python的Web框架,用于开发高性能、可扩展的Web应用程序。在Tornado中,静态文件与重定向是非常常见的功能。下面是对它们的使用说明: 1. 静态文件: 在Tornado中,可以使用`StaticFileHandler`处理静态文件。可以通过以下方式来创建一个`StaticFileHandler`: ```python import tornado.web class StaticHandler(tornado.web.StaticFileHandler): pass ``` `StaticFileHandler`的默认路径是`./static`,可以通过设置`StaticFileHandler`的`path`属性来指定静态文件的路径。例如: ```python import tornado.web class StaticHandler(tornado.web.StaticFileHandler): def initialize(self, path): super().initialize(path=path) ``` 在使用`StaticFileHandler`时,需要指定静态文件的URL和文件路径。可以通过以下方式来指定: ```python import tornado.web class StaticHandler(tornado.web.StaticFileHandler): def initialize(self, path): super().initialize(path=path, default_filename='index.html') def get(self): return super().get(self.request.path[1:]) ``` 上面的代码中,`default_filename`指定了默认返回的文件名,如果URL中没有指定具体的文件名,则返回该文件。`get()`方法实际上是调用了`StaticFileHandler`的`get()`方法,`self.request.path[1:]`是指去掉URL中的第一个字符(即'/')后的字符串。例如,当URL为`http://localhost:8000/static/css/style.css`时,`self.request.path[1:]`的值为`static/css/style.css`。 2. 重定向: 在Tornado中,可以使用`RedirectHandler`来进行重定向。可以通过以下方式来创建一个`RedirectHandler`: ```python import tornado.web class RedirectHandler(tornado.web.RedirectHandler): pass ``` `RedirectHandler`的默认代码是302,可以通过设置`RedirectHandler`的`code`属性来指定重定向的代码。例如: ```python import tornado.web class RedirectHandler(tornado.web.RedirectHandler): def initialize(self, url): super().initialize(url=url, code=301) ``` 在使用`RedirectHandler`时,需要指定重定向的URL。可以通过以下方式来指定: ```python import tornado.web class RedirectHandler(tornado.web.RedirectHandler): def initialize(self, url): super().initialize(url=url, permanent=True) def get(self): return super().get(self.request.path[1:]) ``` 上面的代码中,`permanent`指定了是否永久重定向。`get()`方法实际上是调用了`RedirectHandler`的`get()`方法,`self.request.path[1:]`是指去掉URL中的第一个字符(即'/')后的字符串。例如,当URL为`http://localhost:8000/old`时,`self.request.path[1:]`的值为`old`。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值