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

 

posted @ 2021-08-05 20:06  南风丶轻语  阅读(111)  评论(0编辑  收藏  举报