Django-仅将字符串/用户输入的某些部分标记为安全?

Django-仅将字符串/用户输入的某些部分标记为安全?,django,django-templates,django-template-filters,Django,Django Templates,Django Template Filters,用户文本输入如下所示: Test 'post'. Post at 8:52 on Feb 3rd. /u/username created it. This <a href="link">link</a> should not be displayed as a link. 然后它甚至显示 <a href="link">link</a> 如何使其仅显示 /u/username 作为链接 编辑:我正在使用Django 1.5 在我的模板中,假设

用户文本输入如下所示:

Test 'post'. Post at 8:52 on Feb 3rd. /u/username created it.
This <a href="link">link</a> should not be displayed as a link.
然后它甚至显示

<a href="link">link</a>
如何使其仅显示

/u/username
作为链接

编辑:我正在使用Django 1.5

在我的模板中,假设

comment
是一个

我将注释显示为:

{{ comment|customUrlize }}

除非文本中有一些额外的格式需要保留,否则您可以在修改文本之前对其进行修改

返回给定的文本,其中包含编码为在HTML中使用的符号、引号和尖括号。输入首先通过
force_text()
传递,输出应用了
mark_safe()

所以这一行:

words = word_split_re.split(force_text(value))
变成这样:

words = word_split_re.split(escape(value))
完整的过滤器是:

from django.utils.html import escape

word_split_re = re.compile(r'(\s+)')

@register.filter
@stringfilter
def customUrlize(value):
    words = word_split_re.split(escape(value)) 
    for i, b in enumerate(words):
        if b.startswith('/u/'):
            username = b[3:]
            if re.match("^[A-Za-z0-9_-]*$", username):
                b = "<a href='testLink'>" + b + "</a>"
                words[i] = mark_safe(b)
    return mark_safe(''.join(words))
从django.utils.html导入转义
word\u split\u re=re.compile(r'(\s+))
@寄存器过滤器
@细滤器
def customUrlize(值):
words=word\u split\u re.split(转义(值))
对于枚举中的i、b(文字):
如果b.startswith('/u/'):
用户名=b[3:]
如果重新匹配(“^[A-Za-z0-9_-]*$”,用户名):
b=“”
单词[i]=马克·萨弗(b)
返回标记_safe(“”.join(单词))
并应提供:

Test 'post'. Post at 8:52 on Feb 3rd. <a href='testLink'>/u/username</a> created it.
This &lt;a href="link"&gt;link&lt;/a&gt; should not be displayed as a link.
测试“post”。2月3日8:52发布。创造了它。
此a href=“link”链接/a不应显示为链接。
其呈现为:

测试“post”。2月3日8:52发布。创造了它。 这不应显示为链接


根据您的需要,这可能不会有帮助,但您可以将字符串一分为二,在模板中仅用| safe标记第一个字符串

例如:

a = "Test 'post'. Post at 8:52 on Feb 3rd. <a href='testLink'>/u/username</a> created it. This <a href='link'>link</a> should not be displayed as a link."

b = a.split('it.')
或者随便什么,然后在模板中
{{string1 | safe}}
{{string2}}


输出将是您想要的。当然,没有“它”。但是这很容易修复。

hm,您能否再次确认您显示的渲染文本与您的渲染文本完全相同?我复制粘贴了你的过滤器,但对我来说,它仍然呈现“”而不是实际的链接。即使在应用了自定义过滤器之后,Django似乎也会自动转义文本。如果有帮助的话,我正在使用Django 1.5。这就是应该呈现的内容,我不理解这个问题。如果它没有转义
,则呈现的文本对我来说如下:“Test'post.”2月3日8:52发布。创建了它。此a href=“link”链接/a不应显示为链接。“我希望”“呈现为实际链接,而不是在html中显示”“。”。我现在说的更有意义了吗?还有,对不起,我在最初的评论中说“它仍然呈现”的意思是“它仍然被呈现为”“甚至不远”。听起来像是在显示链接。
{{ comment|customUrlize }}
words = word_split_re.split(force_text(value))
words = word_split_re.split(escape(value))
from django.utils.html import escape

word_split_re = re.compile(r'(\s+)')

@register.filter
@stringfilter
def customUrlize(value):
    words = word_split_re.split(escape(value)) 
    for i, b in enumerate(words):
        if b.startswith('/u/'):
            username = b[3:]
            if re.match("^[A-Za-z0-9_-]*$", username):
                b = "<a href='testLink'>" + b + "</a>"
                words[i] = mark_safe(b)
    return mark_safe(''.join(words))
Test 'post'. Post at 8:52 on Feb 3rd. <a href='testLink'>/u/username</a> created it.
This &lt;a href="link"&gt;link&lt;/a&gt; should not be displayed as a link.
a = "Test 'post'. Post at 8:52 on Feb 3rd. <a href='testLink'>/u/username</a> created it. This <a href='link'>link</a> should not be displayed as a link."

b = a.split('it.')
'string1': b[0]
'string2': b[1]