为python实现xml/html/xhtml标记安全字符串
MarkupSafe-slow的Python项目详细描述
实现一个支持html字符串的unicode子类:
>>>frommarkupsafeimportMarkup,escape>>>escape("<script>alert(document.cookie);</script>")Markup(u'<script>alert(document.cookie);</script>')>>>tmpl=Markup("<em>%s</em>")>>>tmpl%"Peter > Lustig"Markup(u'<em>Peter > Lustig</em>')
如果要使对象的Unicode不是Unicode 但不想丢失污染信息,你可以使用 soft_unicode函数。(在python 3上,还可以使用soft_str,其中 是同一函数的不同名称)。
>>>frommarkupsafeimportsoft_unicode>>>soft_unicode(42)u'42'>>>soft_unicode(Markup('foo'))Markup(u'foo')
HTML表示法
对象可以通过重写 __html__函数:
>>>classFoo(object):...def__html__(self):...return'<strong>Nice</strong>'...>>>escape(Foo())Markup(u'<strong>Nice</strong>')>>>Markup(Foo())Markup(u'<strong>Nice</strong>')
无声转义
自从markupsafe 0.10以来,现在还有一个单独的转义函数 调用的escape_silent返回的None的空字符串 与为^{tt5}返回空字符串的其他系统的一致性$ 转义时(例如pylons的webhelpers)。
如果您还想将其用于标记的escape方法 对象,您可以创建自己的子类来执行此操作:
frommarkupsafeimportMarkup,escape_silentasescapeclassSilentMarkup(Markup):__slots__=()@classmethoddefescape(cls,s):returncls(escape(s))
新样式字符串格式
从python 2.6和 现在完全支持3.x。以前那些人的逃跑行为 功能充其量是不稳定的。新的实现在 以下算法:
- 如果一个对象有一个__html_format__方法,它被称为 用格式说明符替换__format__。也不是 必须返回字符串或标记对象。
- 如果一个对象有一个__html__方法,它将被调用。
- 否则,python的默认格式系统就会启动,结果 是HTML转义的。
下面是如何实现自己的格式:
classUser(object):def__init__(self,id,username):self.id=idself.username=usernamedef__html_format__(self,format_spec):ifformat_spec=='link':returnMarkup('<a href="/user/{0}">{1}</a>').format(self.id,self.__html__(),)elifformat_spec:raiseValueError('Invalid format spec')returnself.__html__()def__html__(self):returnMarkup('<span class=user>{0}</span>').format(self.username)
以及格式化该用户:
>>>user=User(1,'foo')>>>Markup('<p>User: {0:link}').format(user)Markup(u'<p>User: <a href="/user/1"><span class=user>foo</span></a>')
markupsafe支持python 2.6、2.7和python 3.3及更高版本。