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函数帮助查询小工具
Mar 13 Python
python迭代器的使用方法实例
Nov 21 Python
Python列表(list)、字典(dict)、字符串(string)基本操作小结
Nov 28 Python
Python中处理unchecked未捕获异常实例
Jan 17 Python
Python中几个比较常见的名词解释
Jul 04 Python
Python爬取APP下载链接的实现方法
Sep 30 Python
利用Python找出序列中出现最多的元素示例代码
Dec 08 Python
Python同步遍历多个列表的示例
Feb 19 Python
基于python的selenium两种文件上传操作实现详解
Sep 19 Python
Python编写一个验证码图片数据标注GUI程序附源码
Dec 09 Python
Python Selenium自动化获取页面信息的方法
Aug 31 Python
OpenCV-Python 实现两张图片自动拼接成全景图
Jun 11 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
Terran剧情介绍
2020/03/14 星际争霸
PHP开发中常用的三个表单验证函数使用小结
2010/03/03 PHP
PHP导出MySQL数据到Excel文件(fputcsv)
2011/07/03 PHP
配置php网页显示各种语法错误
2013/09/23 PHP
php curl上传、下载、https登陆实现代码
2017/07/23 PHP
收集的10个免费的jQuery相册
2011/02/26 Javascript
JavaScript高级程序设计阅读笔记(六) ECMAScript中的运算符(二)
2012/02/27 Javascript
jquery中JSON的解析方式
2015/03/16 Javascript
详解vue 数组和对象渲染问题
2018/09/21 Javascript
layer弹出层自定义提交取消按钮的例子
2019/09/10 Javascript
详解element-ui级联菜单(城市三级联动菜单)和回显问题
2019/10/02 Javascript
vue 组件开发原理与实现方法详解
2019/11/29 Javascript
JS原型prototype和__proto__用法实例分析
2020/03/14 Javascript
JavaScript枚举选择jquery插件代码实例
2020/11/17 jQuery
在Python中操作日期和时间之gmtime()方法的使用
2015/05/22 Python
SQLite3中文编码 Python的实现
2017/01/11 Python
Python使用LDAP做用户认证的方法
2019/06/20 Python
win10环境下配置vscode python开发环境的教程详解
2019/10/16 Python
Python多线程操作之互斥锁、递归锁、信号量、事件实例详解
2020/03/24 Python
pycharm 2018 激活码及破解补丁激活方式
2020/09/21 Python
html5视频媒体标签video的使用方法及完整参数说明详解
2019/09/27 HTML / CSS
AE美国鹰美国官方网站:American Eagle Outfitters
2016/08/22 全球购物
巴西图书和电子产品购物网站:Saraiva
2017/06/07 全球购物
诗普兰迪官方网站:Splendid
2018/09/18 全球购物
Shop Apotheke瑞士:您的健康与美容网上商店
2019/10/09 全球购物
汽车技术服务英文求职信范文
2014/01/02 职场文书
中学生家长评语大全
2014/04/16 职场文书
临床护理求职信
2014/04/26 职场文书
机械设备与数控技术专业求职信
2014/08/10 职场文书
2014年最新大专生职业生涯规划书范文
2014/09/13 职场文书
2014年幼儿园教学工作总结
2014/12/04 职场文书
慈善献爱心倡议书
2015/04/27 职场文书
2016年度继续教育学习心得体会
2016/01/19 职场文书
Golang二维数组的使用方式
2021/05/28 Golang
html中两种获取标签内的值的方法
2022/06/10 HTML / CSS
Java多线程并发FutureTask使用详解
2022/06/28 Java/Android