Frage

Ich bin mit Mako + Pylone und ich habe eine schreckliche Menge von Leerzeichen in meiner HTML-Ausgabe bemerkt.

Wie würde ich mich über loswerden es bekommen? Reddit verwalten, es zu tun.

War es hilfreich?

Lösung

Ich bin sicher nicht, ob es einen Weg gibt es innerhalb Mako selbst zu tun, aber man kann immer nur einige Post-Rendering-Verarbeitung tun, bevor Sie die Seite dienen oben. Zum Beispiel, sagen Sie den folgenden Code haben, die Ihre horrenden Leerzeichen erzeugt:

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?

Sie könnten wie dies in einem zusätzlichen Schritt:

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

... wo cleanup_whitespace () ist eine Funktion, die das tut, was Sie wollen (es könnte es durch HTML Tidy oder schlanker oder was auch immer). Es ist nicht der effizienteste Weg, es zu tun, aber es macht für ein kurzes Beispiel:)

Andere Tipps

Es gibt die Backslash Sache.

Schauen Sie auf der Homepage von mako http://makotemplates.org für ein Beispiel.

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

Aber im Ernst, ich würde nicht zu viel Zeit damit verbringen, den richtigen Ausgang zu formatieren. Was wichtig ist, ist lesbar Template-Code zu haben. Ich benutze den Web-Inspektoren von Webkit (oder Firebug, wenn Sie bevorzugen) häufiger als „Quelltext anzeigen“.

Wenn Sie wirklich gut formatierte HTML-Ausgabe möchten, können Sie immer eine Middleware schreiben, der das tut.

Der einzige Weg, dies ohne Nachbearbeitung zu tun wäre, um Leerzeichen in der Vorlage zu vermeiden. Doch das wird die Dinge sehr schwer für Sie als Entwickler.

Sie müssen eine Entscheidung darüber treffen, ob die Zeit, um die HTML-Zeichenfolge zu reinigen, nachdem die Vorlage gerendert wurde eine ausreichende Bandbreite zu sparen, diese Kosten zu kompensieren. Ich empfehle, mit optimierten C-Code-Bibliothek, dies zu tun für Sie, wie 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>'

Wenn Sie Ihre Daten nicht zu dynamisch sind, können Sie eine optimierte Cache der Vorlage Ausgabe speichern und dienen diese zur Web-Clients.

Ähnlich wie Dan Antwort, habe ich die gerenderte Ausgabe durch diese Funktion, die „absichtlich“ Leerzeichen nur bewahrt. I definiert ist, dass zwei carrage kehrt in einer Reihe (d.h eine leere Zeile)

sein,

So

Hello 
There

Wird

Hello There

Aber

Hello

There

Wird

Hello
There

Hier ist der Code

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 )

Wie so Execute (Ich habe einen Teil von Dans Beispiel)

whitespace_mess = template.render(somevar="Hello \nThere")
cleaned_up_output = filter_newline(whitespace_mess)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top