假设我们要生成下面这样的 html 字符串:
12345678
|
welcome, Tom - age: 20
- weight: 100
- height: 170
|
要求姓名以及
中的内容是根据变量动态生成的,也就是这样的:
没接触过模板的同学可能会想到使用字符串格式化的方式来实现:
123456789101112131415161718
|
HTML = \’\’\’\’\’\’ 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
|
要求姓名以及 中的内容是根据变量动态生成的,也就是这样的:
没接触过模板的同学可能会想到使用字符串格式化的方式来实现:
123456789101112131415161718
|
HTML = \’\’\’\’\’\’ 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] |
|