【问题标题】:store html templates in docstrings?将html模板存储在文档字符串中?
【发布时间】:2011-07-13 19:53:13
【问题描述】:

我在工作中使用 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)

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

【问题讨论】:

    标签: python flask docstring


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      但是,为什么不呢:

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

      【讨论】:

        【解决方案3】:

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

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

        您可以使用多行字符串来保存您的模板,这可能是个好主意。将它们制作为文档字符串不会获得任何好处。

        【讨论】:

        • 糟糕的计划。同意 template = """&lt;select....multiline string...&lt;/select&gt;""" 是个好主意。
        • 感谢您的想法,我想我倾向于同意您的看法。我更多是从“聪明”的角度考虑这个问题,并且几乎只是想知道它是否值得。
        猜你喜欢
        • 2016-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多