让我们一起来构建一个模板引擎(一)
admin
2023-07-31 00:44:48
0

假设我们要生成下面这样的 html 字符串:

12345678
    

welcome, Tom

    
            
  • age: 20
  •         
  • weight: 100
  •         
  • height: 170
  •     



要求姓名以及 中的内容是根据变量动态生成的,也就是这样的:

123456
    

welcome, {name}

    
            {info}    



没接触过模板的同学可能会想到使用字符串格式化的方式来实现:

123456789101112131415161718 HTML = \’\’\’
    

welcome, {name}

    
            {info}    
\’\’\’  def gen_html(person):    name = person[\’name\’]    info_list = [        \'
  • {0}: {1}
  • \’
    .format(item, value)        for item, value in person[\’info\’].items()    ]    info = \’\\n\’.join(info_list)    return HTML.format(name=name, info=info)



    这种方案有一个很明显的问题那就是,需要拼接两个 html 片段。 使用过模板技术的同学应该很容易就想到,在 Web 开发中生成 HTML 的更常用的办法是使用模板:

    1234567891011121314 HTML = \’\’\’
        

    welcome, {{ person[\’name\’] }}

        
              {% for item, value in person[\’info\’].items() %}        
    • {{ item }}: {{ value }}
    •         {% endfor %}    
    \’\’\’  def gen_html(person):    return Template(HTML).render({\’person\’: person})



    本系列文章要讲的就是如何从零开始实现一个这样的模板引擎( Template )。

    使用技术

    我们将使用将模板编译为 python 代码的方式来解析和渲染模板。 比如上面的模板将被编译为如下 python 代码:

    1234567891011121314151617181920212223 def render_function():    result = []     result.extend([        \'
    \\n\’,        \'

    welcome, \’        str(person[\’name\’]),        \'

    \\n\’
    ,        \'
      \\n\’    ])    for item, value in person[\’info\’].items():        result.extend([            \'
    • \’,            str(item),            \’: \’,            str(value),            \'
    • \\n\’
              ])    result.extend([        \'
    \\n\’
            ayon-syntax crayon-theme-github crayon-font-monaco crayon-os-pc print-yes notranslate\” data-settings=\” minimize scroll-always\” style=\” margin-top: 12px; margin-bottom: 12px; font-size: 13px !important; line-height: 15px !important;\”>

    12345678
        

    welcome, Tom

        
              
    • age: 20
    •         
    • weight: 100
    •         
    • height: 170
    •     




    要求姓名以及 中的内容是根据变量动态生成的,也就是这样的:

    123456
        

    welcome, {name}

        
              {info}    



    没接触过模板的同学可能会想到使用字符串格式化的方式来实现:

    123456789101112131415161718 HTML = \’\’\’
        

    welcome, {name}

        
              {info}    
    \’\’\’  def gen_html(person):    name = person[\’name\’]    info_list = [        \'
  • {0}: {1}
  • \’
    .format(item, value)        for item, value in person[\’info\’].items()    ]    info = \’\\n\’.join(info_list)    return HTML.format(name=name, info=info)



    这种方案有一个很明显的问题那就是,需要拼接两个 html 片段。 使用过模板技术的同学应该很容易就想到,在 Web 开发中生成 HTML 的更常用的办法是使用模板:

    1234567891011121314 HTML = \’\’\’
        

    welcome, {{ person[\’name\’] }}

        
              {% for item, value in person[\’info\’].items() %}        
    • {{ item }}: {{ value }}
    •         {% endfor %}    
    \’\’\’  def gen_html(person):    return Template(HTML).render({\’person\’: person})



    本系列文章要讲的就是如何从零开始实现一个这样的模板引擎( Template )。

    使用技术

    我们将使用将模板编译为 python 代码的方式来解析和渲染模板。 比如上面的模板将被编译为如下 python 代码:

    1234567891011121314151617181920212223 def render_function():    result = []     result.extend([        \'
    \\n\’,        \'

    welcome, \’        str(person[\’name\’]),        \'

    \\n\’
    ,        \'
      \\n\’    ])    for item, value in person[\’info\’].items():        result.extend([            \'
    • \’,            str(item),            \’: \’,            str(value),            \'
    • \\n\’
              ])    result.extend([        \'
    \\n\’
            an class=\”crayon-o\”>=[[v[1],v[0]] for v in items]

    相关内容

    热门资讯

    Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
    定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
    scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
    500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
    小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
    pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
    微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
    65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
    Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
    项目管理和工程管理的区别 项目管理 项目管理,顾名思义就是专注于开发和完成项目的管理,以实现目标并满足成功标准和项目要求。 工...