我正在使用Mako模板創建網頁。金字塔 - mako:部分轉義HTML
有一個部分,我可以防止html轉義使用| ñ。但是,在內部,我還需要顯示一些用戶生成的條目,我需要在應用程序的視圖面上轉義HTML。
金字塔是怎麼走的呢?
我知道有CGI轉義,但它似乎不如Mako自己的,我想用這個。
目前我有:
from pyramid.compat import escape
escape(str)
謝謝!
我正在使用Mako模板創建網頁。金字塔 - mako:部分轉義HTML
有一個部分,我可以防止html轉義使用| ñ。但是,在內部,我還需要顯示一些用戶生成的條目,我需要在應用程序的視圖面上轉義HTML。
金字塔是怎麼走的呢?
我知道有CGI轉義,但它似乎不如Mako自己的,我想用這個。
目前我有:
from pyramid.compat import escape
escape(str)
謝謝!
根據pyramid docs,pyramid.compat.escape
提供了cgi.escape
(在Python 3上的html.escape
)。
根據mako docs,轉義功能由markupsafe.escape(x)
提供。有一點需要注意的是,MarkupSafe可以在它正在轉義的對象上尋找__html__
方法,如果它找到它,它將調用該方法並將結果用作轉義字符串。這可能會讓您在某些項目的轉義方面有一定的靈活性。
您可以使用其中一個選項,或者另一個選項(如果可能)更改您的模板,以便轉義確實發生在模板中而不是視圖中。
webhelpers包提供了一個可能有所幫助的轉義函數。 從docs:
webhelpers.html.builder
HTML生成器提供:
創建在Python化方式(X)HTML標記的HTML對象。
一個文字類,用於標記包含有意識的HTML標記的字符串。
smart escape()函數可保留字面值,但會轉義可能意外包含標記字符(「<」,「>」,「&」,'「,」'「)或惡意JavaScript標記的其他字符串。轉義字符串以文字形式返回以防止它們稍後被雙重轉義。
我想我會在這裏扔我的2美分,因爲我正在尋找解決類似的問題。 就我而言,我對Python和Pyramid非常陌生,我正在修改Single File Tasks Tutorial以創建一個(非常)簡單的博客。
我的帖子內容被保存爲一個字符串在sqlite數據庫。問題在於,當內容字符串輸出到模板時,html標籤顯示爲純文本。
因此,而不是:
我得到:
添加| 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}
我希望這可以幫助別人。
我使用了一些有限的標記降價(和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「工作!