1

我在工作中使用 Flask 为内部应用程序编写 Web 服务。许多 Web 服务 URI 的返回 HTML 部分,我试图找出一种干净的方式来存储 html 模板字符串。我不想将模板字符串放在单独的文件中,因为它们通常只有几行长,而且我不希望有 20 个模板文件,每个文件都有 3 行。我正在考虑在函数的文档字符串中定义一个函数的 html 模板字符串,因为我觉得这将有多种用途。它将作为文档,基本上说“这是我输出的”,并且让我不必将 3 行模板字符串存储在单独的文件中。这就是我所说的:

@app.route('/path/to/my/resource/<int:_id>')
def some_resource(_id):
    """
    <select id="resource-{{ resource.id }}" class="resource">
        {% for choice in choices %}
        <option id="choice-{{ choice.id }}" value="{{ choice.id }}">
            {{ choice.text }}
        </option>
        {% endfor %}
    </select>
    """

    # retrieving resource, etc...

    return render_template_string(some_resource.__doc__, **kwargs)

我不知道这是否会成为一场噩梦……有什么想法吗?

4

3 回答 3

3

我认为这是一个糟糕的计划。

文档字符串用于文档,模板不是文档。文档应该描述该功能的用途。HTML 模板是一个糟糕的替代品。

您可以使用多行字符串来保存您的模板,这可能是一个好主意。通过使它们成为文档字符串,您不会获得任何收益。

于 2011-03-11T22:11:04.360 回答
0

这当然是一个有趣的想法,并且按照 doctest 的示例,在您的 docstrings 中放置功能有用的东西而不仅仅是文本并非完全闻所未闻。明显的缺点是文档字符串中没有文档。现在,如果方法不是程序员可能需要在 via help()(或使用文档字符串自动生成的文档)上记录的方法,这可能会或可能不会是一个大问题。

但是,为什么不呢:

  1. 只需使用本地字符串变量- 缺点是您无法__doc__从函数范围之外获取它
  2. 如果它只使用过一次,只需将其放入render_template_string调用中- 与 #1 相同的缺点,但如果多次使用它也不适用
  3. 创建另一个将这个字符串作为参数的装饰器- 特别是如果它只是遵循上面的模式,你只使用它一次并且你总是在最后做同样的调用,这将允许你把它拉出来那个方法
于 2011-03-11T22:12:15.087 回答
0

在一些模板引擎中,如果一个对象有一个__html__方法,它的输出被视为一个安全(转义)字符串。

def fn(x):
    bla = x
fn.__html__ = lambda : '''
    <h1>Headline</h1>
    <p>lorem ipsum</p>
    '''
于 2011-03-11T22:35:23.950 回答