六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 58|回复: 0

python学习笔记

[复制链接]

升级  10%

15

主题

15

主题

15

主题

秀才

Rank: 2

积分
65
 楼主| 发表于 2013-1-26 16:21:32 | 显示全部楼层 |阅读模式
初学tornado,发现tornado框架模板引擎可扩展性非常高,小做笔记下关于"如何添加自定义函数在对应模板中":

这里是代码场景:

import tornado.httpserverimport tornado.ioloopimport 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 c0 hello1 hello2 hello3 hello4 hello5 hello6 hello7 hello8 hello9 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很值得学习 ;)

请大家帮忙予以指正、帮助啊,如果有什么地方我理解错了或者好的建议等等!
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表