tornado總結4-html模板使用2

參考地址

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


代碼說明

  my_uimodules.py

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

  header.html

<div>
    <a href="/">主頁</a>
    <a href="/page1">頁面1</a>
    <a href="/page2">頁面2</a>
    <span>你如今處於頁面 {{ location }}</span>
</div>

  本模板文件做爲頁面的頂部導航欄,並經過location參數獲得當前的頁面地址
oop

  main.py

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

相關文章
相關標籤/搜索