Tornado学习笔记(2)
admin
2023-07-31 01:44:57
0

表单和模板

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,并且插入你在表单中填写的值。

渲染摸板

这和我在第一章里看到的例子差不多RequestHandler传给tornado.web.Application对象。但是还是有区别的,首先是传递了一个template_path参数。template_path参数告诉Tornado在哪里寻找模板文件。而这里的self.render()方法则是告诉Tornado来读取模板文件,并将结果返回给浏览器。
然而这里的index.html并不完整,它的确是一个已经写好的HTML标记,但是一般情况下我们会输出我们所希望HTML结合程序传入给模板的值。{{}}所括起来的字符串,括起来的字符串就是占位符,我们在渲染模板的时候会希望以实际的值代替。这里还是可以通过render()函数传递所希望表达出来的关键字参数。例如这里的:

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

这里就告诉模板我们将传入的参数。
这里的{{}}可以填充任意的Python表达式:

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

同样可以在Tornado模板中使用条件和循环语句。控制语句以{% %}包围。
一般以{%if condition%}。依旧可以使用for,while等条件控制语句,但是要记得以{%end %}结尾。
这里有其他的一些默认提供的一些便利的函数:

escape() #替换字符串中的&、为他们对应的HTML字符
url_escape() #使用urlib。quote_plus替换字符串s中的字符为URL编码形式。
squeeze() #过滤字符串,把连续的多个空白字符替换成一个空格

模板扩展

Tornado可以方便我们扩展一个已经存在的模板,只需要在新的模板文件顶部放上{%extends “filename.html”%}这里便是使得新的HTML文件继承了父HTML文件的所有标签。
这里我们就需要用到块了,block语句可以帮助我们改变一些模板元素。每个{%block %}对应一个{% end%}

UI模块

UI模块是封装模板中包含的标记、样式以及行为的可复用组件。它所定义的元素通常用于多个模板交叉复 用或在同一个模板中重复使用。模块本身是一个继承自Tornado的UIModule类的简单Python类,并定义 了一个render()方法。

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 \'

Hello, world!

\' 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()方法返回的字符串。

例如在这里:

    

UI Module Example
    

 {% module Hello() %}    

 

这里通过模板标签自身的位置调用HelloModule返回的字符串进行填充。

嵌入JavaScript和CSS

为了给这些模块提供更高的灵活性,Tornado允许你使用embedded_css和embedded_javascript方法嵌 入其他的CSS和JavaScript文件
不仅仅是可以返回一个JavaScript和CSS规则,而且更加灵活的是在闭合的标签前添加完整的HTML标记。
你可以使用javascript_files()和css_files()来 包含完整的文件,不论是本地的还是外部的。

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\"

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
python清除字符串里非数字... 本文实例讲述了python清除字符串里非数字字符的方法。分享给大家供大家参考。具体如下: impor...