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为单位进行的,就是一个像素上可以有多个采样点,每个采样点都有深度信息.深度模版测试对 ...
随机推荐
- Web 软件测试 Checklist 应用系列,第 1 部分: 数据输入
Web 软件测试 Checklist 应用系列,第 1 部分: 数据输入 本文为系列文章"Web 软件测试 Checklist 应用系列"中的第一篇.该系列文章旨在阐述 Check ...
- PHP Error 和 Logging 函数
PHP Error 和 Logging 函数 PHP Error 和 Logging 简介 Error 和 Logging 函数允许您对错误进行处理和记录. Error 函数允许用户定义错误处理规则, ...
- Unity3d中C#使用指针(Unsafe)的办法(转)
近日由于在U3D项目中要使用到数据传递(C++ DLL的数据传递给U3D中的C#),其中涉及到需要使用C#的指针.直接编译会出现以下错误Unsafe code requires the 'unsafe ...
- directX学习系列8 颜色融合(转)
1, Multipass(多通道) 将一个任务划分成几个阶段,由多个pass处理不同阶段,后续pass总是处理前一个pass的结果.例如复杂的光照方程可以分成几个pass来计算. 用不同的 ...
- BOM表生成
- 去除字符串中空格的方法(2016.1.12P141-2)
// forif来处理空格 // 方法一 String str = " ww sse rr"; String str1;// 定义一个中间变量 String str2 = &quo ...
- kudu
Kudu White Paper http://www.cloudera.com/documentation/betas/kudu/0-5-0/topics/kudu_resources.html h ...
- 错误记录--The import XXX cannot be resolved
错误:The import XXX cannot be resolved弄了好久,import类的都没问题,但就是报错.选择project --> clean后,OK.如果还不行,删掉全部imp ...
- 深入了解Windows句柄到底是什么
深入了解Windows句柄到底是什么 http://blog.csdn.net/wenzhou1219/article/details/17659485 总是有新入门的Windows程序员问我Wind ...
- VB动态添加WebBrowser控件,并拦截弹出窗口(不用引用任何组件)
新建空白窗体,然后粘帖下面代码: Option ExplicitPublic WithEvents br As VBControlExtender Private Sub br_ObjectEvent ...