我想在django应用程序中实现一些基本的减价。其目标是获取用户输入,并将其格式化为换行和url识别。
我知道我可以在模板中这样做:
{{ text|urlize|linebreaks }}在不受信任的用户输入的视图中是否有这样做的方法?就像这样:
from django.utils.html import urlize
def foo(request):
text = urlize("<script>console.log('break')</script> www.bar.com")
return render(request, 'index.html' {'text':text})也就是说,让它将链接呈现为安全,但不呈现字符串的其余部分。
发布于 2014-11-08 08:46:37
答案可能是否定的(给出你的样本文本)
urlize的docs声明如下:
如果urlize应用于已经包含HTML标记的文本,事情就不会像预期的那样工作。仅将此筛选器应用于纯文本。
但是,如果您查看源或urlize,它实际上是非常直接的。您可能会提取出包含URL或电子邮件的相关部分,并将其直接传递给urlize函数。
Django不能将字符串的一部分标记为安全的原因是,它将整个字符串标记为安全,并返回一个安全字符串对象。如果您只希望字符串的一部分是安全的,那么它必须从父字符串中剪切出来,并使它自己安全(不支持只对字符串的一部分进行消毒,您可以对整个字符串进行消毒,或者不对其进行任何处理)。
这一点在SafeText的源代码中非常清楚。
class SafeText(six.text_type, SafeData):
"""
A unicode (Python 2) / str (Python 3) subclass that has been specifically
marked as "safe" for HTML output purposes.
"""
def __add__(self, rhs):
"""
Concatenating a safe unicode string with another safe byte string or
safe unicode string is safe. Otherwise, the result is no longer safe.
"""
t = super(SafeText, self).__add__(rhs)
if isinstance(rhs, SafeData):
return SafeText(t)
return t
def _proxy_method(self, *args, **kwargs):
"""
Wrap a call to a normal unicode method up so that we return safe
results. The method that is being wrapped is passed in the 'method'
argument.
"""
method = kwargs.pop('method')
data = method(self, *args, **kwargs)
if isinstance(data, bytes):
return SafeBytes(data)
else:
return SafeText(data)
encode = curry(_proxy_method, method=six.text_type.encode)https://stackoverflow.com/questions/26815294
复制相似问题