Python tornado 之 模板的继承
1、我们可以像复用python中的函数一样,复用一个HTML模板。
语法:
通过 {% extends "xxx.html" %} 复用xxx.html模板,xxx.html表示模板文件
要继承一个父模板,只需要在文件的最上面写上一句 {% extends "xxx.html" %} 即可
通过 {% block block_name %}{% end %}来重写模板中定义的块 ,block_name表示块的名字
要实现自己与父模板不同的新功能,只需要重写父模板的block块即可
举例:
(1)先定义一个基础模板文件 命名: base_template.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> {% block header %} <title>基础模板-title</title> {% end %} </head> <body> {% block body %} <h1>基础模板一级标题</h1> <h2>基础模板二级标题</h2> <a href="/children">进入孩子节点模板</a> {% end %} <p>这是不可改变的标签,因为它不在block块里</p> <p>这是不可改变的标签,因为它不在block块里</p> <p>这是不可改变的标签,因为它不在block块里</p> </body> </html>
(2)再定义一个孩子节点模板,继承基础模板 命名: children_template.html
{% extends "base_template.html" %} {% block header %} <title>孩子节点-title</title> {% end %} {% block body %} <h1>孩子节点一级标题</h1> <h2>孩子节点二级标题</h2> <a href="/grandson">进入孙子节点模板</a> {% end %} <p>这是不可显示的标签,因为它不在block块里</p> <p>这是不可显示的标签,因为它不在block块里</p> <p>这是不可显示的标签,因为它不在block块里</p>
(3)再定义一个孙子节点模板,继承继承模板 命名: grandson_template.html
{% extends "base_template.html" %} {% block header %} <title>孙子节点-title</title> {% end %} {% block body %} <h1>孙子节点一级标题</h1> <h2>孙子节点二级标题</h2> <h3>来自后台的三级标题:{{h3}}</h3> <h4>来自后台的四级标题:{{h4}}</h4> <a href="/">进入基础模板</a> {% end %} <p>这是不可显示的标签,因为它不在block块里</p> <p>这是不可显示的标签,因为它不在block块里</p> <p>这是不可显示的标签,因为它不在block块里</p>
(4)定义后台py文件
import os.path import tornado.ioloop import tornado.web from tornado.options import define from tornado.options import options class MyApplication(tornado.web.Application): def __init__(self, ): template_path = os.path.join(os.path.dirname(__file__), 'template') template_path = os.path.abspath(template_path) static_path = os.path.join(template_path, 'static'), settings = { 'handlers': [ # 请求路由 ('/', BaseHandler), ('/children', ChildrenHandler), ('/grandson', GrandsonHandler), ], 'template_path': template_path, # 模板路径 'static_path': static_path, # 静态资源路径 'debug': True, # 设置为debug模式 } super().__init__(**settings) class BaseHandler(tornado.web.RequestHandler): def get(self): self.render('base_template.html') class ChildrenHandler(tornado.web.RequestHandler): def get(self): self.render('children_template.html') class GrandsonHandler(tornado.web.RequestHandler): def get(self): self.render('grandson_template.html', h3='嘿嘿', h4='嘻嘻') if __name__ == '__main__': # 定义端口, 可以全局使用options.port获取,可通过命令行更改 define('port', default=8080, help='设置启动服务的端口', type=int) options.parse_command_line() # 分析命令行参数 application = MyApplication() # 监听端口8080,可以通过命令行改变,python xxx.py --port=8090 application.listen(options.port) tornado.ioloop.IOLoop.current().start() # 启动web服务
解析:
直接继承Application类,重写init函数,把路由和模板资源路径,静态资源路径传递进去即可。
这种写法等同于以前的写法
template_path = os.path.join(os.path.dirname(__file__), 'template') template_path = os.path.abspath(template_path) application = tornado.web.Application( handlers=[('/', BaseHandler)], template_path=template_path, static_path=os.path.join(template_path, 'static'), debug=True, # 设置为debug模式 ) # 设置路由 # 监听端口8080,可以通过命令行改变,python xxx.py --port=8090 application.listen(options.port) tornado.ioloop.IOLoop.current().start() # 启动web服务
运行后,访问浏览器 http://127.0.0.1:8080/
点击进入孩子节点模板
点击进入孙子节点模板
学习链接 : http://doc.iplaypy.com/tornado/ch3.html