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合并多个装饰器小技巧
Apr 28 Python
Python的MongoDB模块PyMongo操作方法集锦
Jan 05 Python
Python语言描述KNN算法与Kd树
Dec 13 Python
Python实现合并同一个文件夹下所有PDF文件的方法示例
Apr 28 Python
使用Python 统计高频字数的方法
Jan 31 Python
Python3 串口接收与发送16进制数据包的实例
Jun 12 Python
python二分法查找算法实现方法【递归与非递归】
Dec 06 Python
Python 写了个新型冠状病毒疫情传播模拟程序
Feb 14 Python
使用PyQt5实现图片查看器的示例代码
Apr 21 Python
python爬虫请求头的使用
Dec 01 Python
利用Python过滤相似文本的简单方法示例
Feb 03 Python
浅析python中特殊文件和特殊函数
Feb 24 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 header功能的使用
2013/10/28 PHP
php中的动态调用实例分析
2015/01/07 PHP
javascript 字符 Escape,encodeURI,encodeURIComponent
2009/07/09 Javascript
解决ExtJS在chrome或火狐中正常显示在ie中不显示的浏览器兼容问题
2013/01/11 Javascript
JS操作数据库的实例代码
2013/10/17 Javascript
js验证电话号码与手机支持+86的正则表达式
2014/01/23 Javascript
js 数值转换为3位逗号分隔的示例代码
2014/02/19 Javascript
Jquery选择器中使用变量实现动态选择例子
2014/07/25 Javascript
用JavaScript实现页面重定向功能的教程
2015/06/04 Javascript
纯JavaScript基于notie.js插件实现消息提示特效
2016/01/18 Javascript
使用JavaScript实现ajax的实例代码
2016/05/11 Javascript
瀑布流的实现方式(原生js+jquery+css3)
2020/06/28 Javascript
jQuery点击弹出层弹出模态框点击模态框消失代码分享
2017/01/21 Javascript
基于vue-cli配置lib-flexible + rem实现移动端自适应
2017/12/26 Javascript
JavaScript实现的文本框placeholder提示文字功能示例
2018/07/25 Javascript
在vue中实现禁止回退上一步,路由不存历史记录
2020/07/22 Javascript
[02:32]DOTA2亚洲邀请赛 VG战队巡礼
2015/02/03 DOTA
Python中关于使用模块的基础知识
2015/05/24 Python
Python获取系统默认字符编码的方法
2015/06/04 Python
python matplotlib坐标轴设置的方法
2017/12/05 Python
Python中的TCP socket写法示例
2018/05/11 Python
opencv实现图片模糊和锐化操作
2018/11/19 Python
Python对列表的操作知识点详解
2019/08/20 Python
python圣诞树编写实例详解
2020/02/13 Python
Python实现子类调用父类的初始化实例
2020/03/12 Python
Python中使用filter过滤列表的一个小技巧分享
2020/05/02 Python
css3选择器基本介绍
2014/12/15 HTML / CSS
详解CSS3的box-shadow属性制作边框阴影效果的方法
2016/05/10 HTML / CSS
Fossil美国官网:化石手表、手袋、首饰及配饰
2019/02/17 全球购物
求职信结尾怎么写
2014/05/26 职场文书
cf战队收人口号
2014/06/21 职场文书
土建专业毕业生自荐书
2014/07/04 职场文书
公司委托书范本5篇
2014/09/20 职场文书
企业务虚会发言材料
2014/10/20 职场文书
暗恋桃花源观后感
2015/06/12 职场文书
spring cloud 配置中心native配置方式
2021/09/25 Java/Android