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基于mysql实现的简单队列以及跨进程锁实例详解
Jul 07 Python
在Python上基于Markov链生成伪随机文本的教程
Apr 17 Python
Python实现豆瓣图片下载的方法
May 25 Python
python绘制铅球的运行轨迹代码分享
Nov 14 Python
Python SQLite3简介
Feb 22 Python
python实现微信远程控制电脑
Feb 22 Python
python跳过第一行快速读取文件内容的实例
Jul 12 Python
Python pyinotify模块实现对文档的实时监控功能方法
Oct 13 Python
Django 接收Post请求数据,并保存到数据库的实现方法
Jul 12 Python
python的列表List求均值和中位数实例
Mar 03 Python
django 扩展user用户字段inlines方式
Mar 30 Python
python自动统计zabbix系统监控覆盖率的示例代码
Apr 03 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
MOTOROLA 摩托罗拉 MODEL 66-XI五灯中波收音机
2021/03/02 无线电
PHP 可阅读随机字符串代码
2010/05/26 PHP
Laravel框架学习笔记(二)项目实战之模型(Models)
2014/10/15 PHP
php简单统计在线人数的方法
2016/05/10 PHP
php 流程控制switch的简单实例
2016/06/07 PHP
php投票系统之增加与删除投票(管理员篇)
2016/07/01 PHP
使用jquery与图片美化checkbox和radio控件的代码(打包下载)
2010/11/11 Javascript
JQuery中html()方法使用不当带来的陷阱
2011/04/07 Javascript
javascript 弹出窗口中是否显示地址栏的实现代码
2011/04/14 Javascript
兼容IE、FireFox、Chrome等浏览器的xml处理函数js代码
2011/11/30 Javascript
ajax请求get与post的区别总结
2013/11/04 Javascript
JavaScript中使用Object.create()创建对象介绍
2014/12/30 Javascript
jQuery遍历json中多个map的方法
2015/02/12 Javascript
Javascript 高阶函数使用介绍
2015/06/15 Javascript
jQuery事件绑定on()与弹窗实现代码
2016/04/28 Javascript
js手动播放图片实现图片轮播效果
2016/09/17 Javascript
使用mock.js随机数据和使用express输出json接口的实现方法
2018/01/07 Javascript
关于React动态加载路由处理的相关问题
2019/01/07 Javascript
Vue批量图片显示时遇到的路径被解析问题
2019/03/28 Javascript
layui 数据表格+分页+搜索+checkbox+缓存选中项数据的方法
2019/09/21 Javascript
python使用append合并两个数组的方法
2015/04/28 Python
python获取各操作系统硬件信息的方法
2015/06/03 Python
python实现微信自动回复功能
2018/04/11 Python
Python Cookie 读取和保存方法
2018/12/28 Python
python如何给字典的键对应的值为字典项的字典赋值
2019/07/05 Python
tensorflow实现打印ckpt模型保存下的变量名称及变量值
2020/01/04 Python
python字符串判断密码强弱
2020/03/18 Python
Python中有几个关键字
2020/06/04 Python
Django模型验证器介绍与源码分析
2020/09/08 Python
python实现测试工具(一)——命令行发送get请求
2020/10/19 Python
重新定义牛仔布,100美元以下:Warp + Weft
2018/07/25 全球购物
理工学院学生自我鉴定
2014/02/23 职场文书
观看《周恩来的四个昼夜》思想汇报
2014/09/12 职场文书
老人与海读书笔记
2015/06/26 职场文书
小学语文课《掌声》教学反思
2016/03/03 职场文书
vue中使用mockjs配置和使用方式
2022/04/06 Vue.js