我应该使用哪种?为什么?有关系吗? SafeUnicode或django.utils.safestring.mark_safe()?

时间:2010-06-05 00:12:12

标签: python django string

假设我有一个带有一些HTML的自定义表单标签,如下所示:

SafeUnicode('<span class="superscript">&trade;</span>')

为什么Django 1.2有一个函数mark_safe如果存在?有什么区别?

感谢您的帮助!

1 个答案:

答案 0 :(得分:5)

mark_safe是一个工厂函数,它封装了一些类型检查逻辑,以便适当地返回SafeUnicodeSafeString(或者可能是其他一些子类) SafeData你应该定义任何这样的子类)。 source很容易引用......:

89  def mark_safe(s):
90      """
91      Explicitly mark a string as safe for (HTML) output purposes. The returned
92      object can be used everywhere a string or unicode object is appropriate.
93  
94      Can be called multiple times on a single string.
95      """
96      if isinstance(s, SafeData):
97          return s
98      if isinstance(s, str) or (isinstance(s, Promise) and s._delegate_str):
99          return SafeString(s)
100     if isinstance(s, (unicode, Promise)):
101         return SafeUnicode(s)
102     return SafeString(str(s))

使用SafeUnicode(s)代替make_safe(s)只会快一点,但是如果你有可能处理一种不乐意支持传递给{的类型和值,可能会让你陷入困境{1}}初始值设定项(例如,带有非ascii代码的字节字符串,非字符串,带有字符串委托的SafeUnicode,...)。如果你100%确定你知道自己在做什么,那么没有什么可以阻止你采用纳秒节省方法; - )。

顺便说一下,关于开源代码的一些问题(无论文档记录多少,Django的文档真的令人印象深刻)通常最好先回顾一下代码(然后询问代码是否太复杂或者微妙地遵循保证)。