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实现一个简单的验证码程序
Nov 03 Python
Python中Numpy包的安装与使用方法简明教程
Jul 03 Python
详解pyenv下使用python matplotlib模块的问题解决
Nov 29 Python
python虚拟环境迁移方法
Jan 03 Python
python 实现12bit灰度图像映射到8bit显示的方法
Jul 08 Python
在Python中使用filter去除列表中值为假及空字符串的例子
Nov 18 Python
Python识别html主要文本框过程解析
Feb 18 Python
pyqt5中动画的使用详解
Apr 01 Python
Django中使用Json返回数据的实现方法
Jun 03 Python
python中实现词云图的示例
Dec 19 Python
Python3.9.1中使用match方法详解
Feb 08 Python
Python机器学习之底层实现KNN
Jun 20 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按百分比生成缩略图的代码分享
2014/05/10 PHP
php中判断数组相等的方法以及数组运算符介绍
2015/03/30 PHP
在Mac OS上搭建PHP的Yii框架及相关测试环境
2016/02/14 PHP
js DOM模型操作
2009/12/28 Javascript
js字符串的各种格式的转换 ToString,Format
2011/08/08 Javascript
JavaScript与DOM组合动态创建表格实例
2012/12/23 Javascript
JS连连看源码完美注释版(推荐)
2013/12/09 Javascript
jquery组件使用中遇到的问题整理及解决
2014/02/21 Javascript
chrome下jq width()方法取值为0的解决方法
2014/05/26 Javascript
详解Javascript事件驱动编程
2016/01/03 Javascript
JavaScript SweetAlert插件实现超酷消息警告框
2016/01/28 Javascript
js仿小米官网图片轮播特效
2016/09/29 Javascript
关于foreach循环中遇到的问题小结
2017/05/08 Javascript
Webpack性能优化 DLL 用法详解
2017/08/10 Javascript
详解Vue + Vuex 如何使用 vm.$nextTick
2017/11/20 Javascript
JQuery Ajax动态加载Table数据的实例讲解
2018/08/09 jQuery
javascript和php使用ajax通信传递JSON的实例
2018/08/21 Javascript
JS计算两个数组的交集、差集、并集、补集(多种实现方式)
2019/05/21 Javascript
基于iview-admin实现动态路由的示例代码
2019/10/02 Javascript
Python中装饰器高级用法详解
2017/12/25 Python
使用python爬虫实现网络股票信息爬取的demo
2018/01/05 Python
python实现linux下抓包并存库功能
2018/07/18 Python
python 检查是否为中文字符串的方法
2018/12/28 Python
python跳出双层for循环的解决方法
2019/06/24 Python
python多项式拟合之np.polyfit 和 np.polyld详解
2020/02/18 Python
python中取绝对值简单方法总结
2020/07/24 Python
scrapy中如何设置应用cookies的方法(3种)
2020/09/22 Python
详解如何用canvas画一个微笑的表情
2019/03/14 HTML / CSS
Html5适配iphoneX刘海屏的简单实现
2019/04/09 HTML / CSS
Andrew Marc官网:设计师外套的领先制造商
2019/10/30 全球购物
《欢乐的泼水节》教学反思
2014/04/22 职场文书
给校长的建议书200字
2014/05/16 职场文书
课外科技活动总结
2014/08/27 职场文书
初三英语教学计划
2015/01/23 职场文书
土木工程毕业答辩开场白
2015/05/29 职场文书
python+opencv实现视频抽帧示例代码
2021/06/11 Python