http://www.tornadoweb.org/en/stable/guide/templates.html?highlight=render#ui-modules html
osc的全部頁面頂部都有這個導航條, 咱們能夠使用tornado的UI modules來實現導航條,實現代碼的複用.python
增長了一個my_uimodules.py,裏面包含了供tornado模板使用的uimodules,增長了一個header.html裏面是導航條的html代碼,增長了一個page2.py,返回簡單的html頁面page2.html.git
訪問路徑 "/"時的效果web
點擊導航連接 "頁面1"的效果app
點擊導航連接 "頁面2"的效果ide
import tornado.web class HeaderBar(tornado.web.UIModule): def render(self, location): return self.render_string("header.html", location=location) class HeaderBar2(tornado.web.UIModule): def render(self, location): return self.render_string("header.html", location=location)
全部的模板驅動都繼承自 tornado.web.UIModule , 而後調用render_string調用指定的模板和參數. 你能夠在此處寫一個頂部導航欄再寫個側邊導航欄. 我只在這裏寫了一個頂部導航模板驅動. 它接受一個參數location, 我把它做爲導航欄最右側的頁面說明. 本模板驅動返回的是header.html,並把location傳給了它.tornado
<div> <a href="/">主頁</a> <a href="/page1">頁面1</a> <a href="/page2">頁面2</a> <span>你如今處於頁面 {{ location }}</span> </div>
本模板文件做爲頁面的頂部導航欄,並經過location參數獲得當前的頁面地址
oop
import os import tornado.httpserver import tornado.ioloop import tornado.web import my_uimodules from handlers.home import HomeHandler from handlers.page1 import Page1Handler from handlers.page2 import Page2Handler class PageNotFoundHandler(tornado.web.RequestHandler): def get(self): return self.write_error(404) class Application(tornado.web.Application): def __init__(self): handlers = [ (r"/", tornado.web.RedirectHandler, {"url": "/home"}), (r"/home", HomeHandler), (r"/page1", Page1Handler), (r"/page2", Page2Handler), (r".*", PageNotFoundHandler), ] settings = dict( static_path= os.path.join(os.path.dirname(__file__), "static"), template_path=os.path.join(os.path.dirname(__file__), "templates"), ui_modules=my_uimodules, ) tornado.web.Application.__init__(self, handlers, **settings) if __name__ == "__main__": port = 8899 application = Application() http_server = tornado.httpserver.HTTPServer(application, xheaders=True) http_server.listen(port) print('Listen on http://localhost:{0}'.format(port)) print('Listen on http://localhost:{0}/page1'.format(port)) print('Listen on http://localhost:{0}/page2'.format(port)) tornado.ioloop.IOLoop.instance().start()
在torndao進行初始化設置時, 在settings 裏面指定了自定義模板所在模塊.ui
"ui_modules=my_uimodules" url
當tornado在處理模板時,若是碰到以下的語句, 它就會去剛纔設置的ui_modules模塊中去找 xxxx模板驅動
{% module xxxx %}
home.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>主頁</title> </head> <body> {% module HeaderBar("主頁") %} <h1 id="home_head">這是主頁</h1> <script src="/static/js/home.js"></script> </body> </html>
page1.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>{{ argu1 }}</title> </head> <body> {% module HeaderBar("頁面1") %} <h1>這是Page1</h1> <ul> {% for i in argu2 %} <li>{{ i }}</li> {% end %} </ul> </body> </html>
page2.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Page2</title> </head> <body> {% module HeaderBar("頁面2") %} <h1>這是Page2</h1> </body> </html>
全部頁面模板的body的第一行都添加了一個 {% module HeaderBar("頁面2") %} ,如前面所講當tornado在處理render的模板時若是碰到了這種格式的請求,就會去 ui_modules 指定的模塊my_uimodules下面查找HeaderBar,並把"頁面2"做爲第一個參數傳給了它, HeaderBar把這個參數當作location傳給了 header.html.
就這樣每一個頁面頂部導航欄的相同和不一樣之處都體現了出來.
代碼git地址
http://git.oschina.net/donggen/tornado-test