1. 程式人生 > 其它 >Python tornado 之 模板的繼承

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