7

我正在使用 Mako + Pylons,我注意到我的 HTML 输出中有大量的空白。

我将如何摆脱它?Reddit 设法做到了。

4

5 回答 5

8

有反斜杠的东西。

以 mako 的主页http://makotemplates.org为例。

<%def name="makerow(row)">
    <tr>
    % for name in row:
        <td>${name}</td>\
    % endfor
    </tr>
</%def>

但说真的,我不会花太多时间尝试正确格式化输出。重要的是要有可读的模板代码。与“查看源代码”相比,我更频繁地使用 Webkit(或 FireBug,如果您愿意)的网络检查器。

如果你真的想要良好的格式化 html 输出,你总是可以编写一个中间件来做到这一点。

于 2010-10-06T01:14:13.860 回答
4

在没有后处理的情况下做到这一点的唯一方法是避免模板中的空格。但是,这将使您作为开发人员变得非常困难。

您需要决定在呈现模板后清理 HTML 字符串的时间是否会节省足够的带宽来抵消此成本。我建议使用优化的 C 代码库为您执行此操作,例如lxml.html.

>>> from lxml import html
>>> page = html.fromstring("""<html>
... 
... <body>yuck, a newline! bandwidth wasted!</body>
... </html>""")
>>> html.tostring(page)
'<html><body>yuck, a newline! bandwidth wasted!</body></html>'
于 2010-10-06T04:25:41.717 回答
2

我不确定是否有办法在 Mako 本身内执行此操作,但您始终可以在提供页面之前进行一些渲染后处理。例如,假设您有以下代码会生成可怕的空格:

from mako import TemplateLookup

template_lookup = TemplateLookup(directories=['.'])
template = template_lookup.get_template("index.mako")
whitespace_mess = template.render(somevar="no whitespace here")
return whitespace_mess # Why stop here?

您可以像这样添加一个额外的步骤:

from mako import TemplateLookup

template_lookup = TemplateLookup(directories=['.'])
template = template_lookup.get_template("index.mako")
whitespace_mess = template.render(somevar="no whitespace here")
cleaned_up_output = cleanup_whitespace(whitespace_mess)
return cleaned_up_output

...其中 cleanup_whitespace() 是一些可以执行您想要的功能(它可以通过HTML Tidyslimer或其他方式传递它)。这不是最有效的方法,但它是一个简单的例子:)

于 2010-10-06T01:13:20.747 回答
0

如果您的数据不是太动态,您可以存储模板输出的优化缓存并将其提供给 Web 客户端。

于 2010-10-06T00:27:27.620 回答
0

与丹的回答类似,我通过这个函数传递了渲染的输出,它只保留了“故意”的空白。我将其定义为连续两个回车(即空行)

所以

Hello 
There

变成

Hello There

Hello

There

变成

Hello
There

这是代码

def filter_newline(input):
    rendered_output = []
    for line in input.split("\n"):
        if line:
            # Single new-lines are removed
            rendered_output.append(line)
        else:
            # Subsequent newlines (so no body to the interveaning line) are retained
            rendered_output.append("\n")

    return "".join( rendered_output )

像这样执行(我偷了丹的部分例子)

whitespace_mess = template.render(somevar="Hello \nThere")
cleaned_up_output = filter_newline(whitespace_mess)
于 2016-05-19T22:55:48.037 回答