2010-10-06 61 views

回答

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 Tidyslimmer或其他)。这不是最有效的方法,但它使得一个快速的例子:)

2

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

+0

我不知道如何,涉及到我的空白问题。你能详细说明一下吗? – 2010-10-06 00:34:02

+0

好吧,让Mako像现在一样生成模板。而且,并不是增加后处理每个请求的复杂性(很可能是通过正则表达式),而是在页面处理完毕后提供缓存版本的页面。 – 2010-10-06 00:56:31

6

有反斜杠的东西。

查看mako http://makotemplates.org的首页。

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

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

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

+0

http://docs.makotemplates.org/en/latest/syntax.html?highlight=empty#newline-filters – 2015-04-24 13:16:05

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>' 
0

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

所以

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)