Tornado學習筆記(2)

表單和模板

import os.path

import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web

from tornado.options import define, options
define("port", default=8000, help="run on the given port", type=int)

class IndexHandler(tornado.web.RequestHandler):
    def get(self):
        self.render('index.html')

class PoemPageHandler(tornado.web.RequestHandler):
    def post(self):
        noun1 = self.get_argument('noun1')
        noun2 = self.get_argument('noun2')
        verb = self.get_argument('verb')
        noun3 = self.get_argument('noun3')
        self.render('poem.html', roads=noun1, wood=noun2, made=verb,
                difference=noun3)

if __name__ == '__main__':
    tornado.options.parse_command_line()
    app = tornado.web.Application(
        handlers=[(r'/', IndexHandler), (r'/poem', PoemPageHandler)],
        template_path=os.path.join(os.path.dirname(__file__), "templates")
    )
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()

這個表單包括了多個文本,其中的內容在用戶點擊提交以後以POST請求的方式發送到/poem。Tornado爲了響應這個請求會自動跳到poem.html,而且插入你在表單中填寫的值。javascript

渲染摸板

這和我在第一章裏看到的例子差很少RequestHandler傳給tornado.web.Application對象。可是仍是有區別的,首先是傳遞了一個template_path參數。template_path參數告訴Tornado在哪裏尋找模板文件。而這裏的self.render()方法則是告訴Tornado來讀取模板文件,並將結果返回給瀏覽器。
然而這裏的index.html並不完整,它的確是一個已經寫好的HTML標記,可是通常狀況下咱們會輸出咱們所但願HTML結合程序傳入給模板的值。{{}}所括起來的字符串,括起來的字符串就是佔位符,咱們在渲染模板的時候會但願以實際的值代替。這裏仍是能夠經過render()函數傳遞所但願表達出來的關鍵字參數。例如這裏的:css

self.render('poem.html', roads=noun1, wood=noun2, made=verb, difference=noun3)

這裏就告訴模板咱們將傳入的參數。
這裏的{{}}能夠填充任意的Python表達式:html

>>> from tornado.template import Template
>>> print Template("{{2+3}}").generate()
5
>>> print Template({{'gogogojuststudy'[-5:]}}").generate()
study
>>>

一樣能夠在Tornado模板中使用條件和循環語句。控制語句以{% %}包圍。
通常以{%if condition%}。依舊可使用for,while等條件控制語句,可是要記得以{%end %}結尾。
這裏有其餘的一些默認提供的一些便利的函數:java

escape() #替換字符串中的&、爲他們對應的HTML字符
url_escape() #使用urlib。quote_plus替換字符串s中的字符爲URL編碼形式。
squeeze() #過濾字符串,把連續的多個空白字符替換成一個空格

模板擴展

Tornado能夠方便咱們擴展一個已經存在的模板,只須要在新的模板文件頂部放上{%extends 「filename.html」%}這裏即是使得新的HTML文件繼承了父HTML文件的全部標籤。
這裏咱們就須要用到塊了,block語句能夠幫助咱們改變一些模板元素。每一個{%block %}對應一個{% end%}jquery

UI模塊

UI模塊是封裝模板中包含的標記、樣式以及行爲的可複用組件。它所定義的元素一般用於多個模板交叉復 用或在同一個模板中重複使用。模塊自己是一個繼承自Tornado的UIModule類的簡單Python類,並定義 了一個render()方法。web

import tornado.web
import tornado.httpserver
import tornado.ioloop
import tornado.options
import os.path

from tornado.options import define, options
define("port", default=8000, help="run on the given port", type=int)

class HelloHandler(tornado.web.RequestHandler):
    def get(self):
        self.render('hello.html')

class HelloModule(tornado.web.UIModule):
    def render(self):
        return '<h1>Hello, world!</h1>'

if __name__ == '__main__':
    tornado.options.parse_command_line()
    app = tornado.web.Application(
        handlers=[(r'/', HelloHandler)],
        template_path=os.path.join(os.path.dirname(__file__), 'templates'),
        ui_modules={'Hello': HelloModule}
    )
    server = tornado.httpserver.HTTPServer(app)
    server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()

這個例子裏ui_module字典裏只有一項,這裏把名爲Hello模塊的引用和定義的HELLOMODULE結合起來。當咱們調用HelloHandler並渲染hello.html時,可使用{% module Hello()%}模板標籤來包含HelloModulerender()方法返回的字符串。ajax

例如在這裏:api

<html>    
<head>
<title>UI Module Example</title>
</head>    
<body>
 {% module Hello() %}    
</body>
 </html>

這裏經過模板標籤自身的位置調用HelloModule返回的字符串進行填充。瀏覽器

嵌入JavaScript和CSS

爲了給這些模塊提供更高的靈活性,Tornado容許你使用embedded_css和embedded_javascript方法嵌 入其餘的CSS和JavaScript文件
不單單是能夠返回一個JavaScript和CSS規則,並且更加靈活的是在閉合的標籤前添加完整的HTML標記。
你可使用javascript_files()和css_files()來 包含完整的文件,不管是本地的仍是外部的。app

def css_files(self):    
return "/static/css/newreleases.css"
def javascript_files(self):    
return"https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.14/jquery-ui.min.js"
相關文章
相關標籤/搜索