Python tornado 之 模板的繼承
阿新 • • 發佈:2021-08-05
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