我写了一个写HTML标记的小函数:
def html_tag(tag, content=None, close=True, attrs={}):
lst = ['<',tag]
for key, val in attrs.iteritems():
lst.append(' %s="%s"' % (key, escape_html(val)))
if close:
if content is None: lst.append(' />')
else: lst.extend(['>', content, '</', tag, '>'])
else:
lst.append('>')
return mark_safe(''.join(lst))
很好,但是我读了这篇文章
efficient string concatenation
(我知道这并不重要,但我需要一致性)并决定更新我的脚本:
def html_tag(tag, body=None, close=True, attrs={}):
s = StringIO()
s.write('<%s'%tag)
for key, val in attrs.iteritems():
s.write(' %s="%s"' % (key, escape_html(val)))
if close:
if body is None: s.write(' />')
else: s.write('>%s</%s>' % (body, tag))
else:
s.write('>')
return mark_safe(s.getvalue())
但是现在我的html
逃脱
当我试图从我的模板渲染它时。其他的都一样。如果我把最后一行替换为
return mark_safe(unicode(s.getvalue()))
. 我检查了返回类型
s.getvalue()
. 应该是
str
,就像第一个函数一样,为什么会失败??
也会失败
SafeString(s.getvalue())
但成功的是
SafeUnicode(s.getvalue())
.
我还想指出
return mark_safe(s.getvalue())
在不同的功能中
不
奇怪的行为。
“调用堆栈”如下所示:
class Input(Widget):
def render(self):
return html_tag('input', attrs={'type':self.itype, 'id':self.id,
'name':self.name, 'value':self.value, 'class':self.itype})
class Field:
def __unicode__(self):
return mark_safe(self.widget.render())
然后
{{myfield}}
在模板中。所以它确实
mark_safed
“D两次,我想可能是问题所在,但我也试过把它去掉…..我真的不知道是什么原因造成的,但这不是太难工作,所以我想我不会担心。