Python实现的简单模板引擎功能示例


Posted in Python onSeptember 02, 2017

本文实例讲述了Python实现的简单模板引擎功能。分享给大家供大家参考,具体如下:

#coding:utf- 8
__author__="sdm"
__author_email='sdmzhu3@gmail.com'
__date__ ="$2009-8-25 21:04:13$"
'' '
pytpl 类似 php的模板类
'' '
import sys
import StringIO
import os.path
import os
#模 板的缓存
_tpl_cache={}
class Pytpl:
  def __init__(self,tpl_path='./' ):
    self.tpl_path=tpl_path
    self.data={}
    self.output = StringIO.StringIO()
    pass
  def set(self,name,value):
    '' '
    设 置模板变量
    '' '
    self.data[name]=value;
    pass
  def get(self,name):
    '' '
    得 到模板变量
    '' '
    t={}
    return t.get(name, '' )
    pass
  def tpl(self,tplname):
    '' '
    渲 染模板
    '' '
    f=self.tpl_path+tplname
    if not os.path.exists(f):
      raise Exception('tpl:[%s] is not exists' % f)
    mtime=os.stat(f).st_mtime
    if  not _tpl_cache.has_key(f) or _tpl_cache[f][ 'time' ]<mtime:
      src_code=self.__compile__(open(f).read())
      try :
        t=open(f+'.py' , 'w' )
        t.write(src_code)
        t.close()
      except:
        pass
      py_code=compile(src_code, f+'.py' , 'exec' )
      _tpl_cache[f]={'code' :py_code, 'time' :mtime}
    else :
      py_code= _tpl_cache[f]['code' ]
    exec(py_code, {'self' :self}, self.data)
    return self.output.getvalue()
  def execute(self,code,data,tplname):
    '' '
    执 行这个模板
    '' '
    py_file_name=tplname+'.py'
    f=open(py_file_name,'w' )
    f.write(code)
    f.close()
    execfile(py_file_name, {'self' :self}, data)
  def __compile__ (self,code):
    '' '
    编 译模板
    查找 <?标记
    '' '
    tlen=len(code);
    flag_start='<?'
    flag_end='?>'
    # 默认普通标记
    status=0
    i=0
    #分块 标记
    pos_end=0
    pos_start=0
    #缩 进
    global indent
    indent=0
    py_code=[]
    def place_t_code(c,t_indent):
      '' '
      基 本的代码处理
      '' '
      global indent
      if (c[ 0 ]== '=' ):
        return ( ' ' * 4 *indent) +  'echo ( /'%s/' % (' +c[ 1 :]+ '))'
      lines=c.split("/n" )
      t=[]
      for i in lines:
        indent2=indent
        tmp=i.strip("  /n/r" )
        c=tmp[len(tmp)-1 :len(tmp)]
        # 判定最后一个字符
        if (c== '{' ):
          indent+=1
          tmp=tmp[0 :len(tmp)- 1 ]+ ":"
        elif(c=='}' ):
          indent-=1
          tmp=tmp[0 :len(tmp)- 1 ]
        t.append((' ' * 4 *indent2) +tmp )
      return  "/n" .join(t)
    while  1 :
      if i>=tlen: break
      c=code[i];
      if status== 0 :
        # 编译加速
        pos_start=code.find(flag_start,pos_end);
        if (pos_start>- 1 ):
          s=code[pos_end:pos_start]
          t_code= 'echo ( ' +repr(s)+ ')'
          t_code=' ' *indent* 4 +t_code
          if s:
            py_code.append(t_code)
          i=pos_start
          last_pos=i
          # 进入代码状态
          status=1
          continue
        else :
          # 没有没有找到
          pos_start=tlen
          t_code='echo ( ' +repr(code[pos_end:pos_start])+ ' ) '
          t_code=' ' *indent* 4 +t_code
          py_code.append(t_code)
          break
      if status== 1 :
        # 查找结束标记
        pos_end=code.find(flag_end,i)
        if (pos_end>- 1 ):
          # 需要跳过<? 这个标记
          t_code=place_t_code(code[pos_start+2 :pos_end],indent)
          # 跳过?>结束标记
          pos_end+=2
          py_code.append(t_code)
        else :
          # 没查找到直接结束
          pos_end=tlen
          # 需要跳过<? 这个标记
          t_code=place_t_code(code[pos_start+2 :pos_end],indent)
          py_code.append(t_code)
          break
        status=0
        i=pos_end
        pass
      i+=1
    py_code_str="#coding:utf-8/nimport sys;global echo;echo=self.output.write/n"
    py_code_str+="/n" .join(py_code)
    py_code_str=py_code_str.replace("/t" , "  " )
    return py_code_str
def test():
  tpl=Pytpl('./' );
  tpl.set('title' , '标题3' )
  print tpl.tpl('test.html' )
  pass
if __name__ == "__main__" :
  test()

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python输出汉字字库及将文字转换为图片的方法
Jun 04 Python
python之DataFrame实现excel合并单元格
Feb 22 Python
Django实现单用户登录的方法示例
Mar 28 Python
Python 常用模块 re 使用方法详解
Jun 06 Python
python调用其他文件函数或类的示例
Jul 16 Python
python单向链表的基本实现与使用方法【定义、遍历、添加、删除、查找等】
Oct 24 Python
浅谈python已知元素,获取元素索引(numpy,pandas)
Nov 26 Python
Python列表倒序输出及其效率详解
Mar 04 Python
django 数据库 get_or_create函数返回值是tuple的问题
May 15 Python
Pycharm新手使用教程(图文详解)
Sep 17 Python
详解Python+OpenCV进行基础的图像操作
Feb 15 Python
Python爬虫网络请求之代理服务器和动态Cookies
Apr 12 Python
Python实现Logger打印功能的方法详解
Sep 01 #Python
Python数据分析之如何利用pandas查询数据示例代码
Sep 01 #Python
Python使用回溯法子集树模板解决迷宫问题示例
Sep 01 #Python
Python基于回溯法子集树模板实现8皇后问题
Sep 01 #Python
Python3.x对JSON的一些操作示例
Sep 01 #Python
Python+Socket实现基于TCP协议的客户与服务端中文自动回复聊天功能示例
Aug 31 #Python
Python+Socket实现基于UDP协议的局域网广播功能示例
Aug 31 #Python
You might like
PHP缓存技术的使用说明
2011/08/06 PHP
浅析echo(),print(),print_r(),return之间的区别
2013/11/27 PHP
PHP封装的MSSql操作类完整实例
2016/05/26 PHP
PHP中非常有用却鲜有人知的函数集锦
2019/08/17 PHP
Javascript的闭包
2009/12/31 Javascript
单独使用CKFinder选择图片的方法
2010/08/21 Javascript
初学js插入节点appendChild insertBefore使用方法
2011/07/04 Javascript
JQuery入门——用one()方法绑定事件处理函数(仅触发一次)
2013/02/05 Javascript
使用jquery的ajax需要注意的地方dataType的设置
2013/08/12 Javascript
jQuery手机浏览器中拖拽动作的艰难性分析
2015/02/04 Javascript
javascript中call apply 的应用场景
2015/04/16 Javascript
javascript创建cookie、读取cookie
2016/03/31 Javascript
JavaScript数组去重的几种方法效率测试
2016/10/23 Javascript
javascript 使用正则test( )第一次是 true,第二次是false
2017/02/22 Javascript
js仿微信公众平台打标签功能
2017/04/08 Javascript
IScroll那些事_当内容不足时下拉刷新的解决方法
2017/07/18 Javascript
详解在WebStorm中添加Vue.js单文件组件的高亮及语法支持
2017/10/21 Javascript
vue jsx 使用指南及vue.js 使用jsx语法的方法
2017/11/11 Javascript
微信小程序自定义tabBar组件开发详解
2020/09/24 Javascript
[16:43]Heroes19_剃刀(完美)
2014/10/31 DOTA
跟老齐学Python之画圈还不简单吗?
2014/09/20 Python
Python实现的质因式分解算法示例
2018/05/03 Python
python将字符串list写入excel和txt的实例
2019/07/20 Python
Python获取统计自己的qq群成员信息的方法
2019/11/15 Python
Python matplotlib绘制图形实例(包括点,曲线,注释和箭头)
2020/04/17 Python
移动端html5判断是否滚动到底部并且下拉加载
2019/11/19 HTML / CSS
天美时手表加拿大官网:Timex加拿大
2016/09/01 全球购物
法国设计制造的扫帚和刷子:Andrée Jardin
2018/12/06 全球购物
生物技术专业研究生自荐信
2013/09/22 职场文书
外语专业毕业生个人的自荐信
2013/11/19 职场文书
小加工厂管理制度
2014/01/21 职场文书
电大毕业个人生自我鉴定
2014/03/26 职场文书
2014年行政工作总结
2014/11/19 职场文书
三好学生事迹材料
2014/12/24 职场文书
信息简报范文
2015/07/21 职场文书
2015年除四害工作总结
2015/07/23 职场文书