为python实现xml/html/xhtml标记安全字符串

MarkupSafe-slow的Python项目详细描述


实现一个支持html字符串的unicode子类:

>>>frommarkupsafeimportMarkup,escape>>>escape("<script>alert(document.cookie);</script>")Markup(u'&lt;script&gt;alert(document.cookie);&lt;/script&gt;')>>>tmpl=Markup("<em>%s</em>")>>>tmpl%"Peter > Lustig"Markup(u'<em>Peter &gt; 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。以前那些人的逃跑行为 功能充其量是不稳定的。新的实现在 以下算法:

  1. 如果一个对象有一个__html_format__方法,它被称为 用格式说明符替换__format__。也不是 必须返回字符串或标记对象。
  2. 如果一个对象有一个__html__方法,它将被调用。
  3. 否则,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及更高版本。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java以编程方式最小化JInternalFrame?   java使用JsonPath将不均匀列表提取为类型化对象   spring如何将java/resources文件获取到InputStream?   Java逻辑错误并不总是存在   java Firebase,更新特定字段   Java stream groupby并同时加入以进行csv导出   java安卓:如果出现任何声音,监听器将录制声音   java如何从多个文件中轮询最后修改的文件并发送到apache camel中的目标端点?   java是否返回多个比较器?   JavaBean IO:Date MMM在CAPS中不解析   当JButton从另一个类单击时,java正在更新JLabel   基类中子类的Java泛型初始化   jakarta ee Java ee制作一个以毫秒为间隔的计时器来发送数据包   json Windows Azure日期格式转换为Java日期