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 条件判断的缩写方法
Sep 06 Python
python二叉树的实现实例
Nov 21 Python
python getopt详解及简单实例
Dec 30 Python
使用C++扩展Python的功能详解
Jan 12 Python
Python使用requests及BeautifulSoup构建爬虫实例代码
Jan 24 Python
Python 机器学习库 NumPy入门教程
Apr 19 Python
使用Python处理BAM的方法
Sep 28 Python
Python 支付整合开发包的实现
Jan 23 Python
Python中判断子串存在的性能比较及分析总结
Jun 23 Python
pytho matplotlib工具栏源码探析一之禁用工具栏、默认工具栏和工具栏管理器三种模式的差异
Feb 25 Python
Pytorch 使用tensor特定条件判断索引
Apr 08 Python
详解Python+OpenCV进行基础的图像操作
Feb 15 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根据ip查询所在地区(非常有用,赶集网就用到)
2013/07/01 PHP
深入解析PHP的Yii框架中的缓存功能
2016/03/29 PHP
Nginx环境下PHP flush失效的解决方法
2016/10/19 PHP
Aster vs Newbee BO3 第二场2.18
2021/03/10 DOTA
判断控件是否已加载完成的代码
2010/02/24 Javascript
深入分析escape()、encodeURI()、encodeURIComponent()的区别及示例
2014/08/04 Javascript
js获取input长度并根据页面宽度设置其大小及居中对齐
2014/08/22 Javascript
javascript学习笔记(四)function函数部分
2014/09/30 Javascript
使用BootStrap建立响应式网页——通栏轮播图(carousel)
2016/12/21 Javascript
浅谈javascript的闭包
2017/01/23 Javascript
实例解析js中try、catch、finally的执行规则
2017/02/24 Javascript
vue脚手架vue-cli的学习使用教程
2017/06/06 Javascript
es6 字符串String的扩展(实例讲解)
2017/08/03 Javascript
BootStrap点击保存后实现模态框自动关闭的思路(模态框)
2017/09/26 Javascript
Vue学习之axios的使用方法实例分析
2020/01/06 Javascript
JS FormData对象使用方法实例详解
2020/02/12 Javascript
微信小程序学习总结(一)项目创建与目录结构分析
2020/06/04 Javascript
vue.js实现双击放大预览功能
2020/06/23 Javascript
微信小程序连续签到7天积分获得功能的示例代码
2020/08/20 Javascript
element-ui点击查看大图的方法示例
2020/12/14 Javascript
[52:06]完美世界DOTA2联赛决赛日 Inki vs LBZS 第一场 11.08
2020/11/10 DOTA
python中将字典转换成其json字符串
2014/07/16 Python
python创建列表并给列表赋初始值的方法
2015/07/28 Python
利用python 更新ssh 远程代码 操作远程服务器的实现代码
2018/02/08 Python
Python爬取个人微信朋友信息操作示例
2018/08/03 Python
Python SQL查询并生成json文件操作示例
2018/08/17 Python
使用Python完成15位18位身份证的互转功能
2019/11/06 Python
python将时分秒转换成秒的实例
2019/12/07 Python
Python下载网易云歌单歌曲的示例代码
2020/08/12 Python
windows下python 3.9 Numpy scipy和matlabplot的安装教程详解
2020/11/28 Python
迪拜领先运动补剂零售品牌中文站:Sporter商城
2019/08/20 全球购物
我爱我的祖国演讲稿
2014/05/04 职场文书
个人股份转让协议书范本
2014/10/26 职场文书
三方股东合作协议书
2014/10/28 职场文书
2019年大学生职业生涯规划书
2019/03/25 职场文书
使用pandas生成/读取csv文件的方法实例
2021/07/09 Python