2012-06-22 30 views
2

我正在使用Mako模板創建網頁。金字塔 - mako:部分轉義HTML

有一個部分,我可以防止html轉義使用| ñ。但是,在內部,我還需要顯示一些用戶生成的條目,我需要在應用程序的視圖面上轉義HTML。

金字塔是怎麼走的呢?

我知道有CGI轉義,但它似乎不如Mako自己的,我想用這個。

目前我有:

from pyramid.compat import escape 

escape(str) 

謝謝!

回答

3

根據pyramid docs,pyramid.compat.escape提供了cgi.escape(在Python 3上的html.escape)。

根據mako docs,轉義功能由markupsafe.escape(x)提供。有一點需要注意的是,MarkupSafe可以在它正在轉義的對象上尋找__html__方法,如果它找到它,它將調用該方法並將結果用作轉義字符串。這可能會讓您在某些項目的轉義方面有一定的靈活性。

您可以使用其中一個選項,或者另一個選項(如果可能)更改您的模板,以便轉義確實發生在模板中而不是視圖中。

2

webhelpers包提供了一個可能有所幫助的轉義函數。 從docs

webhelpers.html.builder

HTML生成器提供:

創建在Python化方式(X)HTML標記的HTML對象。

一個文字類,用於標記包含有意識的HTML標記的字符串。

smart escape()函數可保留字面值,但會轉義可能意外包含標記字符(「<」,「>」,「&」,'「,」'「)或惡意JavaScript標記的其他字符串。轉義字符串以文字形式返回以防止它們稍後被雙重轉義。

2

我想我會在這裏扔我的2美分,因爲我正在尋找解決類似的問題。 就我而言,我對Python和Pyramid非常陌生,我正在修改Single File Tasks Tutorial以創建一個(非常)簡單的博客。

我的帖子內容被保存爲一個字符串在sqlite數據庫。問題在於,當內容字符串輸出到模板時,html標籤顯示爲純文本。

因此,而不是:

enter image description here

我得到:

enter image description here

添加| n過濾解決我的問題。 HTML內容現在可以在我的帖子正文中正確顯示。

我的模板(.mako)的帖子列表:

# -*- coding: utf-8 -*- 
<%inherit file="layout.mako"/> 

<ul id="posts"> 
% if posts: 
    % for post in reversed(posts): 
    <li> 
    <span class="name">${post['name']}</span> 
    <span class="content">${post['content'] | n}</span> 
    </li> 
    % endfor 
% else: 
    <li>Sorry, no posts...</li> 
% endif 
</ul> 

和view_config:

@view_config(route_name='list', renderer='list.mako') 
def list_view(request): 
    rs = request.db.execute("select id, name, content from posts") 
    posts = [dict(id=row[0], name=row[1], content=row[2]) for row in rs.fetchall()] 
    return {'posts': posts} 

This answer helped me out.

我希望這可以幫助別人。

0

我使用了一些有限的標記降價(和PageDown鍵在Javascript)以及一些HTML允許用戶定製自己的投入。

之前保存或顯示自定義用戶標記,我清理的HTML:

from html5lib import sanitizer 
from html5lib import html5parser, serializer, treebuilders, treewalkers 

# This sanitizer translates all the troublesome tokens 
def sanitize2(text): 
    if (text is None) or isinstance(text, (int, long)): 
     return text 
    sanobj      = sanitizer.HTMLSanitizer 
    sanobj.strip_tokens   = True 
    sanobj.lowercaseElementName = True 
    sanobj.lowercaseAttrName = True 
    hparser      = html5parser.HTMLParser(tree = treebuilders.getTreeBuilder('dom'), tokenizer=sanobj) 
    dommodel     = hparser.parse(text) 
    serobj      = serializer.htmlserializer.HTMLSerializer(sanitize = False) 
    outstr      = ''.join(serobj.serialize(treewalkers.getTreeWalker('dom')(dommodel))) 
    return outstr 

然後,我有一個自定義錐形過濾實際顯示它:

import markdown 

def jmarkdown(text): 
    return markdown.markdown(text) 

這使得「 | jmarkdown「工作!