tornado中使用Mako模版
tornado是一个优秀的python的开源web 框架,框架本身的性能确实很好,但是他自带的模版只能说是一般般。关于tornado的详细信息可以直接到管网参考。
http://www.tornadoweb.org/en/stable/
Mako是python的一个优秀的模版引擎,其性能在模版引擎中排名比较靠前的,关于Mako,Django,Tornado等这些模版的性能比较,可以直接Google一下,不过貌似都是一篇博客被各种转载,当然可以照这他的源代码自己运行一下来判断。Mako的管网。http://www.makotemplates.org/ 对其又详细的介绍。
sudo pip install Mako 即可安装。
Tornado更换模版引擎比较简单,只需要重写 def render_string(self, template_path, **kwargs) 和def render(self, template_path, **kwargs)
完整代码如下:
#-*- coding: utf-8 -*-
import tornado.web
import os.path
import tornado.ioloop
import mako.lookup
import tornado.httpserver
import mako.template class BaseHandler(tornado.web.RequestHandler): def initialize(self):
template_path = self.get_template_path()
self.lookup = mako.lookup.TemplateLookup(directories=[template_path], input_encoding='utf-8', output_encoding='utf-8')
#self.lookup = mako.lookup.TemplateLookup(directories=[template_path]) def render_string(self, template_path, **kwargs):
template = self.lookup.get_template(template_path)
namespace = self.get_template_namespace()
namespace.update(kwargs)
return template.render(**namespace) def render(self, template_path, **kwargs):
self.finish(self.render_string(template_path, **kwargs))
在 def initialize(self)中 定义了模版的搜索路径,其中模版的搜索路径只在Application的settings中设定的,self.get_template_path()可以获得。
在render_string(self, template_path, **kwargs)中,首先通过get_tempalte(tempalte_path)函数获取模版实例,然后通过get_template_namespace()获取系统定义的一些变量。以字典存储,最后根据用户传递的变量,扩展namespace,直接调用模版的render(**namespace)方法直接输出。
render(self, template_path, **kwargs) 方法比较简单,只调用了self.finish()犯法, finish()方法会调用write(chunk) 响应的。
这样,我们就完成了Mako和Tornado的集成,下面是一个简单是示例:
main.py
#-*- coding: utf-8 -*-
import tornado.web
import os.path
import tornado.ioloop
import mako.lookup
import tornado.httpserver
import mako.template class BaseHandler(tornado.web.RequestHandler): def initialize(self):
template_path = self.get_template_path()
self.lookup = mako.lookup.TemplateLookup(directories=[template_path], input_encoding='utf-8', output_encoding='utf-8') def render_string(self, filename, **kwargs):
template = self.lookup.get_template(filename)
namespace = self.get_template_namespace()
namespace.update(kwargs)
return template.render(**namespace) def render(self, filename, **kwargs):
self.finish(self.render_string(filename, **kwargs)) class IndexHandler(BaseHandler):
def get(self):
self.render('index.html',title='Text',body='This is body') class Application(tornado.web.Application):
def __init__(self):
handlers = [
(r'/',IndexHandler),
]
settings = {
'template_path' : os.path.join(os.path.dirname(__file__),'templates')
}
tornado.web.Application.__init__(self, handlers,**settings) if __name__ == '__main__':
application = Application()
application.listen(8080)
tornado.ioloop.IOLoop.instance().start()
将index.html文件放到templates文件夹下
##-*- coding: utf-8 -*-
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>${title}</title>
</head>
<body>
${body}
</body>
</html>
运行 python main.py
输入网址http://localhost:8080 即可看到结果,如图:

tornado中使用Mako模版的更多相关文章
- 在 tornado 中异步无阻塞的执行耗时任务
在 tornado 中异步无阻塞的执行耗时任务 在 linux 上 tornado 是基于 epoll 的事件驱动框架,在网络事件上是无阻塞的.但是因为 tornado 自身是单线程的,所以如果我们在 ...
- Tornado 中的 get() 或 post() 方法
---恢复内容开始--- Tornado 中的 get() 或 post() 方法 请求处理程序和请求参数 Tornado 的 Web 程序会将 URL 或者 URL 范式映射到 tornado.we ...
- tornado中使用torndb,连接数过高的问题
问题背景 最近新的产品开发中,使用了到了Tornado和mysql数据库.但在基本框架完成之后,我在开发时候发现了一个很奇怪的现象,我在测试时,发现数据库返回不了结果,于是我在mysql中输入show ...
- 在tornado中使用celery实现异步任务处理之中的一个
一.简单介绍 tornado-celery是用于Tornado web框架的非堵塞 celeryclient. 通过tornado-celery能够将耗时任务增加到任务队列中处理, 在celery中创 ...
- 深入tornado中的协程
tornado使用了单进程(当然也可以多进程) + 协程 + I/O多路复用的机制,解决了C10K中因为过多的线程(进程)的上下文切换 而导致的cpu资源的浪费. tornado中的I/O多路复用前面 ...
- 深入tornado中的TCPServer
1 梳理: 应用层的下一层是传输层,而http协议一般是使用tcp的,所以实现tcp的重要性就不言而喻. 由于tornado中实现了ioloop这个反应器以及iostream这个对连接的异步读写,所以 ...
- 深入tornado中的http1connection
前言 tornado中http1connection文件的作用极其重要,他实现了http1.x协议. 本模块基于gen模块和iostream模块实现异步的处理请求或者响应. 阅读本文需要一些基础的ht ...
- 基于python3.x,使用Tornado中的torndb模块操作数据库
目前Tornado中的torndb模块是不支持python3.x,所以需要修改部分torndb源码即可正常使用 1.开发环境介绍 操作系统:win8(64位),python版本:python3.6(3 ...
- OpenGL和D3D11中的深度模版测试
在OpenGL和D3D11的管线中,像素shader之后的操作就是深度模版测试,深度模版测试是以sample为单位进行的,就是一个像素上可以有多个采样点,每个采样点都有深度信息.深度模版测试对 ...
随机推荐
- Oracle数据库--SQL函数
Oracle SQL函数 1.ASCII返回与指定的字符对应的十进制数;SQL> select ascii('A') A,ascii('a') a,ascii('0') zero,ascii( ...
- SELECT 'www' = 0; 1
http://dev.mysql.com/doc/refman/5.7/en/type-conversion.html MySQL 5.7 Reference Manual / Functions ...
- von Neumann architecture
COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION 3.1 COMPUTER COMPONEN ...
- Ubuntu apparmor何方神圣
AppArmor 是一款与SeLinux类似的安全框架/工具,其主要作用是控制应用程序的各种权限,例如对某个目录/文件的读/写,对网络端口的打开/读/写等等. 来之Novell网站的引用: AppAr ...
- USB2.0协议笔记
1.概述 USB(Universal Serial Bus)具有传输速率快,可热插拔等显著特点,应用已经十分广泛,目前的相当多的设备已经支持最新的USB3.0协议.理论上USB1.1的传输速度 ...
- EFI
有CSM的UEFI BIOS应该可以支持EFI Native和legacy两种启动方式吧,在BIOS SETUP选项里面有的选. EFI在开机时的作用和BIOS一样,就是初始化PC,但在细节上却又不一 ...
- 老调重弹:对kvo的封装思路
关于kvo,kvo能做什么? kvo作为cocoa框架的重要特性之一,在底层框架中被大量使用.在特定的场合使用该特性往往能够带来难以想象的好处,让整个方案变得相当简洁和优雅.比如大名鼎鼎的下拉刷新的s ...
- Prism&MEF构建开发框架 (三)
菜单管控模块EntityFW 菜单的加载采用MEF技术,程序实现思路: 1 .主菜单加载页面MainMenuView.xaml指向MenuRegion 2. 菜单Item点击及内容加载,采用订阅模式, ...
- C++ 编译器内存错误 after Normal block。。。
解决 after Normal block(#908) at 0x399EC0. CRT detected that the application wrote to memory after end ...
- json的eval为什么要用msg.d
在做一个关于搜索功能时用到了jquery autocomplete,发现返回数据时都用到了一个.d,比如: var datas = eval('(' + msg.d + ')'); 这个.d是什么呢, ...