在docstrings中存储html模板?

时间:2011-03-11 22:04:56

标签: python flask docstring

我正在使用Flask在我的工作中为内部应用编写Web服务。许多Web服务URI返回HTML部分,我试图找出一种存储html模板字符串的简洁方法。我不想将模板字符串放在单独的文件中,因为它们通常只有几行,我不希望有20个模板文件,每个模板文件中有3行。我正在考虑在函数的docstring中定义一个函数的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)

我不知道这是否会成为一场噩梦......是否有任何想法?

3 个答案:

答案 0 :(得分:4)

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

文档字符串用于文档,模板不是文档。文档应该描述函数的用途。 HTML模板很难替代它。

您可以使用多行字符串来保存模板,这可能是个好主意。你没有通过制作文档来获得任何东西。

答案 1 :(得分:0)

这当然是一个有趣的想法,并且遵循doctest的例子,将功能上有用的东西放在文档字符串而不仅仅是文本中并不是闻所未闻。显而易见的缺点是文档字符串中没有文档。现在,如果方法不是程序员可能需要通过help()(或使用文档字符串自动生成的文档)的文档,这可能是也可能不是一个大问题。

但是,为什么不:

  1. 只使用本地字符串变量 - 缺点是您无法通过__doc__从函数范围之外获取
  2. 如果刚刚使用过一次,只需将其置于render_template_string调用 - 与#1相同的缺点,但如果多次使用则不适用
  3. 创建另一个将此字符串作为参数的装饰器 - 特别是如果它只是按照上面的模式,你只使用它一次,你总是在最后做同样的调用,这将允许你把它从那个方法中拉出来

答案 2 :(得分:0)

在某些模板引擎中,如果对象具有 __ html __ 方法,则将其输出视为安全(转义)字符串。

def fn(x):
    bla = x
fn.__html__ = lambda : '''
    <h1>Headline</h1>
    <p>lorem ipsum</p>
    '''