23.5.5. URL转向与静态文件资源

在Tornado框架的Web编程中,也可以实现与Flask中相同的URL转向的功能。Tornado框架中有两种方法可以实现URL转向:

  • redirect(url) 在业务逻辑中转向URL;

  • RedirectHandler 实现某个URL的直接转向。

RedirectHandler类的具体使用形式为:

(r'/aaa', tornado.Web.RedirectHandler,dict(url='/abc'))

URL转向

代码演示

演示了两种URL转向的实例,代码如下:

#!/usr/bin/env python
# -*- coding:utf8 -*-
# auther; 18793
# Date:2020/5/6 16:41
# filename: sample01.py

"""
在Tornado框架的Web编程中,也可以实现与Flask中相同的URL转向的功能。Tornado框架中有两种方法可以实现URL转向:

* redirect(url) 在业务逻辑中转向URL;
* RedirectHandler 实现某个URL的直接转向。

    RedirectHandler类的具体使用形式为:
    (r'/aaa', tornado.Web.RedirectHandler,dict(url='/abc'))
"""

import tornado.ioloop
import tornado.web


class DistHdl(tornado.web.RequestHandler):
    def get(self):
        self.write("被转向的目的页面!")


class SrcHdl(tornado.web.RequestHandler):
    def get(self):
        self.redirect('/dist')      #在业务逻辑中转向


app = tornado.web.Application([
    (r'/dist', DistHdl),
    (r'/src', SrcHdl),
    (r'/rdrt', tornado.web.RedirectHandler, {'url': '/src'})  # 直接转向
])

if __name__ == '__main__':
    app.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

'''
代码中定义了两个类,DistHdl作为转向的目标URL请求处理器,SrcHdl是转向处理器,
当访问指向这个业务类时,会被转向到‘/dist’网址。
最后,在Application类中定义一个直接转向,只要访问‘/rdrt’就会直接转向到‘/src’。
所以,有趣的是,如果你试图访问'/rdrt'URL,会转向'/src',再最终转向'/dist'。
'''

运行的结果无论是你访问‘/rdrt’,还是访问‘/src’,最后都会如图

转向的目的页面

../../../_images/tornado-dingxiang01.png

使用静态资源文件

Tornado框架也支持在网站的页面中直接使用静态的资源文件,如图片、JS脚本、CSS样式表等。如果需要使用静态文件资源时,需要在Application类初始化时提供“static_path”参数。

代码演示

同级目录下存放static/torn.jpg文件。

演示了在网站页面中引用图片的实例,代码如下:

#!/usr/bin/env python
# -*- coding:utf8 -*-
# auther; 18793
# Date:2020/5/6 16:45
# filename: sample01.py
"""
Tornado框架也支持在网站的页面中直接使用静态的资源文件,如图片、JS脚本、CSS样式表等。
如果需要使用静态文件资源时,需要在Application类初始化时提供“static_path”参数。
"""

import tornado.ioloop
import tornado.web


class SttHdl(tornado.web.RequestHandler):
    def get(self):
        self.write("<img src='/static/torn.jpg' />")         #使用了本网站图片


app = tornado.web.Application([
    (r'/stt', SttHdl),
], static_path='./static')                   #提供了static_path参数

if __name__ == '__main__':
    app.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

【代码说明】 代码中‘/stt’请求返回的HTML代码中是一个img标签,引用本网站中的一幅图片。在初始化Application类时,提供了static_path参数,以指明静态资源的目录。


注意

此处的静态资源目录是相对于运行时所在的路径目录,所以运行服务器命令行时应进入对应的目录,否则无法找到静态资源。你可以使用绝对路径来排除此问题。


【运行效果】 如下图所示,页面中显示了一幅图片: image1