0

我正在尝试在 python 中实现自定义模板格式,完成两件事

  1. Django 之类的分隔符

    {{ 占位符 }}

例如。

from string import Template

class MyTemplate(Template):
     delimiter="{{..}}" #it is only for clarification purpose, though it is invalid

mt = MyTemplate("HELLO {{ world }}")
mt.substitute(world="WORLD")
  1. 如果存在键错误或值错误,请跳过该标识符。

    class MyTemplate(Template): delimiter="{{..}}" #仅用于说明

    数据=“你好{{世界}},这是第一个程序{{程序}}”

    mt = 我的模板(数据)

    mt.substitute(world="WORLD")

那么 o/p 应该是,

 HELLO WORLD, this is 1st program

据我所知,我们可以使用像 jinja2 这样的模板引擎,但这是我最后的选择。我更喜欢使用 python 本机库来做到这一点。

虽然如果你想推荐任何模板引擎(如果可能的话,用例子),那么它也很好。

提前致谢。

4

1 回答 1

1

如果您只想进行简单的字符串格式化,python 包括该str.format()方法以及Template Strings

直接来自文档

>>> from string import Template
>>> s = Template('$who likes $what')
>>> s.substitute(who='tim', what='kung pao')
'tim likes kung pao'
>>> d = dict(who='tim')
>>> Template('Give $who $100').substitute(d)
Traceback (most recent call last):
...
ValueError: Invalid placeholder in string: line 1, col 11
>>> Template('$who likes $what').substitute(d)
Traceback (most recent call last):
...
KeyError: 'what'
>>> Template('$who likes $what').safe_substitute(d)
'tim likes $what'

如果您需要在模板中引入任何类型的逻辑,那么我会非常大胆地说,正确编写自己的代码会让您头疼,并且您会想要使用库。Jinja2是一个优秀的通用模板库。如果您曾经使用过 Django 的模板系统,那么使用起来会轻而易举,因为 Jinja2 是基于 Django 的。

我在 Jinja2 中使用过的一些代码

import jinja2

jinja2.env = jinja2.Environment(
    loader=jinja2.PackageLoader(package_name=__name__,
                                package_path='templates'),
    trim_blocks=True,
    extensions=[
        'jinja2.ext.with_',  # add the with tag
    ],
)

context = {
    'results': results,
    'javascript': js,
    'css': css,
    'version': '.'.join(str(n) for n in __version__),
}

template = env.get_template('my_template.html')

rendered_template = template.render(context)

在 my_template.html

<html>
  <head>
    <title>Hello World</title>
    <style>{{ css }}</style>
    <script>{{ javascript }}</script>
  </head>
  <body>
    <h1>Hello world</h1>
    <ul>
      {% for result in results %}
        <div>
           {{ result.winner_name }}<br />
           {{ result.get_score() }}
        </div>
      {% endfor %}
    </ul>
  </body>
</html>

Django 模板和 Jinja2 模板之间的一个区别是 Jinja2 的理念不是让设计人员易于使用;因此,模板中允许函数调用。

于 2014-06-12T12:43:43.877 回答