`
joy2everyone
  • 浏览: 134770 次
  • 性别: Icon_minigender_1
  • 来自: ...
社区版块
存档分类
最新评论

python学习笔记 - template@tornado 学习记录一

阅读更多
初学tornado,发现tornado框架模板引擎可扩展性非常高,小做笔记下关于"如何添加自定义函数在对应模板中":

这里是代码场景:

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

# define one "add" customization funcation which will be used in the assigned template file.
def add(x, y):
    return (x+y)

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        items = ["item1","item2","item3"]
        # render the corresponding template file, and pass the "**args" to the assigned template
        # not only we can pass the realted parameters, but also can pass the related functions.
        # so extendible and powerful! :)
        self.render("templates/template_test.html", items=items, add=add)


application = tornado.web.Application([
    (r"/", MainHandler),
])

if __name__ == "__main__":
    http_server = tornado.httpserver.HTTPServer(application)
    http_server.listen(8081)
    tornado.ioloop.IOLoop.instance().start()


template_test.html
<html>
<head>
<title>template function test</title>
</head>
<body>
<ul>
{% for item in items %}
    <li>{{ escape(item) }}</li>
{% end %}

{{ add(2,2) }}
</ul>
</body>
</html>


items:我们传递的变量参数
add:我们传递函数


我觉得:
大概的过程是将模板文件转换成string内容,然后再过滤、转换成原生的python代码,这样做的好处有很好的扩展性(例如添加自定义函数用于模板中),同时保留的原始的python语法声明,例如:

Copy from template.py comment
   {% for student in [p for p in people if p.student and p.age > 23] %}
     <li>{{ escape(student.name) }}</li>
   {% end %}



tornado.web.RequestHandler的render_string函数将会使用已知的参数,将模板内容转换成string内容, 然后再调用Template.generate(**args),该函数中会检查并添加新的函数(如果存在的话,通过dict.update)

----------------------------------------------------------------------
然后通过compile内置函数执行对应的语法,这里笔记下compile的语法:

>>> temp = "hello"
>>> str = 'for i in range(0,10): print ("{0} {1}".format(i, temp))'
>>> c = compile(str, 'temp', 'exec')
>>> exec c
0 hello
1 hello
2 hello
3 hello
4 hello
5 hello
6 hello
7 hello
8 hello
9 hello


compile(source, filename, mode[, flags[, dont_inherit]])

compile(source, filename ,mode)函数将一个字符串编译为字节代码, source是将要被编译的字符串, filename是定义该字符串变量的文件(示例代码中的temp将作为一个变量,用于将被执行的语句中,即str),mode参数指定了代码被编译的类型

'exec' if source consists of a sequence of statements
'eval' if it consists of a single expression
'single' if it consists of a single interactive statement

compile()函数返回一个代码对象,该对象当然也可以被传递给eval()函数和exec语句来执行

小结:
template.py 很粗略的看了下,越发觉得tornado很值得学习 ;)

请大家帮忙予以指正、帮助啊,如果有什么地方我理解错了或者好的建议等等!
分享到:
评论
3 楼 zjl284669661 2011-03-11  
http://www.coien-cn.info/?87586.htm
2 楼 joy2everyone 2011-03-01  
skyfen 写道
用过了Django MTV框架 和 webpy 框架 相信你一定会放弃tornado框架的


你好啊, 在学习tornado之前,我也有学习接触一点Django知识,Django相关的文档、已出版电子书比tornado多很多,这对社区的发展很有帮助,但有时候Django ORM“稍显”过紧密的藕合,以及模板语法的一些“限制”,让我觉得tornado更显随意(我没有对Django很熟悉,个人理解很浅显的,见谅啦)

关于webpy,我没有学习过,但是tornado的文档介绍它是类似webpy的一种web框架,webpy做为一款轻量级web框架拥有良好、优雅的扩展性,深受广大python朋友喜欢。

我学习tornado只是出于对python的系统学习:
1. tornado源码文件并不多,而且使用第三方的依赖也并不多,通过阅读源码对于学习python本身而言很有帮助,例如:你可以学习python代码的兼容性,接触各种相关语法,以及一些pythonic思想,大家共勉!
2. tornado不只是一个web框架,还是一个web app server,就目前来看它的性能会更胜一筹(之前也有看到其他网友做的性能测试,链接我找不到了,我自己目前还没有做过相关的性能测试)
http://www.tornadoweb.org/documentation#performance
3. 想接触、学习下non-blocking web server的设计思想

相对所谓“劣势”:
1.好像在国内使用tornado并不多。
2.相关出版电子书资料真的不多,而且官方文档还需要翻*Qiang

我喜欢的:
1.tornado社区挺活跃的,很多人会在上面展开各种讨论、应用
2.源码很值得学习。


以上我没有对任何框架带有任何评价色彩(我只是一名python爱好者)

Happy pythoneering!






1 楼 skyfen 2011-03-01  
用过了Django MTV框架 和 webpy 框架 相信你一定会放弃tornado框架的

相关推荐

Global site tag (gtag.js) - Google Analytics