我正在使用 Mako 模板创建网页。
有一个部分我使用 | 防止 html 转义。n. 但是,在内部,我还需要显示一些用户生成的条目,我需要在应用程序的视图端转义 HTML。
Pyramid 有什么办法呢?
我知道有 CGI 转义,但它似乎不如 Mako 自己的那么好,我想使用它。
目前我有:
from pyramid.compat import escape
escape(str)
谢谢!
我正在使用 Mako 模板创建网页。
有一个部分我使用 | 防止 html 转义。n. 但是,在内部,我还需要显示一些用户生成的条目,我需要在应用程序的视图端转义 HTML。
Pyramid 有什么办法呢?
我知道有 CGI 转义,但它似乎不如 Mako 自己的那么好,我想使用它。
目前我有:
from pyramid.compat import escape
escape(str)
谢谢!
根据金字塔文档,pyramid.compat.escape
提供cgi.escape
(html.escape
在 Python 3 上)。
根据mako 文档,转义功能由markupsafe.escape(x)
. 要记住的一件事可能会有所帮助,MarkupSafe 将__html__
在它正在转义的对象上查找一个方法,如果找到它,它将调用该方法并将结果用作转义字符串。这可能使您在如何转义某些项目方面具有一定的灵活性。
您可以使用其中一个,或者另一个选项(如果可能)来更改您的模板,以便转义确实发生在模板中而不是视图中。
我想我会在这里投入 2 美分,因为我正在寻求解决类似的问题。就我而言,我对 Python 和 Pyramid 非常陌生,我正在修改单文件任务教程以创建一个(非常)简单的博客。
我的帖子内容以字符串形式保存在 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}
我希望这可以帮助别人。
我使用markdown(和Javascript 中的pagedown)进行一些有限的标记以及一些 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”工作!