Tornado是一个速度非常快的非阻塞式Web框架。得利于其非阻塞的方式和对epoll的运用,Tornado每秒可以处理数以千计的连接,这意味着对于实时Web服务来说,Tornado是一个理想的Web框架。下面就来看看Tornado框架配置和模板引擎简介相关内容吧。下面就来实现下面截图所示的内容吧。
Tornao中的模板语言和django中类似,模板引擎将模板文件载入内存,然后将数据嵌入其中,最终获取到一个完整的字符串,再将字符串返回给请求者。
Tornado 的模板支持“控制语句”和“表达语句”,控制语句是使用 {% 和 %} 包起来的 例如 {% if len(items) > 2 %}。表达语句是使用 {{ 和 }} 包起来的,例如 {{ items[0] }}。
控制语句和对应的 Python 语句的格式基本完全相同。我们支持 if、for、while 和 try,这些语句逻辑结束的位置需要用 {% end %} 做标记。还通过 extends 和 block 语句实现了模板继承。这些在 template 模块 的代码文档中有着详细的描述。
注:在使用模板前需要在setting中设置模板路径:"template_path" : "tpl"。
在模板中默认提供了一些函数、字段、类以供模板使用:
escape: tornado.escape.xhtml_escape 的別名
xhtml_escape: tornado.escape.xhtml_escape 的別名
url_escape: tornado.escape.url_escape 的別名
json_encode: tornado.escape.json_encode 的別名
squeeze: tornado.escape.squeeze 的別名
linkify: tornado.escape.linkify 的別名
datetime: Python 的 datetime 模组
handler: 当前的 RequestHandler 对象
request: handler.request 的別名
current_user: handler.current_user 的別名
locale: handler.locale 的別名
_: handler.locale.translate 的別名
static_url: for handler.static_url 的別名
xsrf_form_html: handler.xsrf_form_html 的別名
除了使用框架自带的函数外,还可以自定义UIMethod以UIModule,使用方法是在文件中引入模块,并在Tornado的配置文件中设置。具体的示例代码如下:
#!/usr/bin/env python # -*- coding: utf-8 -*- """ 演示Tornado模板语言 """ import tornado.web import tornado.ioloop import uimethods as mt import uimodules as md title = "欢迎光临!Hello World!" LIST_INFO = [] class IndexHandler(tornado.web.RequestHandler): """ 首页处理 """ def data_received(self, chunk): pass def get(self): name = self.get_argument("name", None) LIST_INFO.append(name) if name else print("name为空") self.render("index.html", title=title, list_info=LIST_INFO) settings = { "template_path": "templates", # 模板文件夹路径 "static_path": "statics", # 静态文件夹路径 'ui_methods': mt, 'ui_modules': md, } app = tornado.web.Application([ (r"/index", IndexHandler), ], **settings) if __name__ == '__main__': app.listen(8080) tornado.ioloop.IOLoop.instance().start()
以上为主文件部分,下面为模板文件部分。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>{{ title }}</title> <meta name="description" content=""> <meta name="keywords" content=""> <link href="{{static_url("css/style.css")}}" rel="stylesheet"> </head> <body> <header> {% block header %}{% end %} </header> <content> <form action="/index" method="get"> <input type="text" name="name"> <input type="submit" value="提交"> </form> {% block body %}{% end %} </content> <footer> {% block footer %}{% end %} </footer> </body> </html>
{% extends "main.html" %} {% block header %} <h1>{{ title }}</h1> {# 自定义Tornado模块 #} {% module Custom(123) %} {# 自定义Tornado函数 #} {{ lower_str(title) }} {% end %} {% block body %} {% for index, item in enumerate(list_info) %} {% if index % 2 == 1 %} <li>{{item}}</li> {% else %} <li style="color: red">{{item}}</li> {% end %} {% end %} {% end %} {% block footer %} <p>首页结束</p> {% end %}
自定义UIMethod以UIModule部分。
#!/usr/local/env python # coding:utf-8 __author__ = "风轻清淡" def lower_str(self, arg: str): """ :param self: :param arg: str :return: """ return arg.lower()
#!/usr/local/env python # coding:utf-8 from tornado.web import UIModule from tornado import escape __author__ = "风轻清淡" class Custom(UIModule): def render(self, *args, **kwargs): return 'UI_Modules'