您的位置:

最佳方案处理django EntitiesForbidden(name, value, base, sysid, pubid, notation_name)

  发布时间:2023-04-04 09:52:48
报错的原因异常是在 Django 中使用函数时可能出现的一种错误。使用 Django 提供的转义函数,如 escape() 和 mark_safe(),而不是使用检查并修正输入数据中的非法字符,如不应该出现在 XML/HTML 中的字符。使用例子使用 Django 提供的转义函数检查并修正输入数据中的非法字符在使用时,使用 escape() 的第二个参数,使得函数不转义未知的字符通过定义白名单来控制允许使用的字符这些例子只是给出了一个思路,你可能需要根据实际情况来调整代码。

报错的原因

EntitiesForbidden 异常是在 Django 中使用 xml.sax.saxutils.escape() 函数时可能出现的一种错误。这个异常是在转义 XML/HTML 中的字符时出现,可能是因为它尝试转义禁止的实体(如 )或未知实体(如 &brand;)造成的。

错误的字符就是 name 参数.value 就是它的值, base,sysid,pubid,notation_name 等参数都是可选参数,表示错误字符所在文件的基本URI,文件系统标识符,Public标识符,以及符号名称。

请检查你的代码哪里使用了 xml.sax.saxutils.escape() 函数或者是使用了不正确的字符进行转义。

如何解决

解决方法可能有几种,可以根据错误所在的具体代码进行调整。

1. 使用 Django 提供的转义函数,如 escape() 和 mark_safe(),而不是使用 xml.sax.saxutils.escape()

2. 检查并修正输入数据中的非法字符,如不应该出现在 XML/HTML 中的字符

3. 在使用 xml.sax.saxutils.escape() 时,可以使用 escape()的第二个参数,使得函数不转义未知的字符

4. 通过定义白名单来控制允许使用的字符

总之, 排查这个错误主要就是要确定是哪里使用了不正确的字符导致的,然后再采取相应的解决方案。

使用例子

1. 使用 Django 提供的转义函数


from django.utils.html import escape

def my_view(request):
    # Do some stuff...
    html = "

Hello, World!

" escaped_html = escape(html) return HttpResponse(escaped_html)

2. 检查并修正输入数据中的非法字符


import re

def clean_input_data(data):
    cleaned_data = re.sub(r'[^a-zA-Z0-9]+', '', data)
    return cleaned_data

def my_view(request):
    dirty_data = request.POST.get('data')
    cleaned_data = clean_input_data(dirty_data)
    # Do some stuff with cleaned_data

3. 在使用 xml.sax.saxutils.escape() 时,使用 escape() 的第二个参数,使得函数不转义未知的字符


import xml.sax.saxutils

def my_view(request):
    # Do some stuff...
    html = "

Hello, World!

" escaped_html = xml.sax.saxutils.escape(html, entities={}) return HttpResponse(escaped_html)

4. 通过定义白名单来控制允许使用的字符


valid_chars = set(string.ascii_letters + string.digits)

def clean_input_data(data):
    cleaned_data = ''.join(c for c in data if c in valid_chars)
    return cleaned_data

def my_view(request):
    dirty_data = request.POST.get('data')
    cleaned_data = clean_input_data(dirty_data)
    # Do some stuff with cleaned_data

这些例子只是给出了一个思路,你可能需要根据实际情况来调整代码。

当然,还有其他解决方案,比如可以考虑使用更高级的库如 lxml 代替 xml.sax 进行解析和转义,这样可能更稳健,可控性更高。

另外就是针对每一种非法字符分别进行处理,这样可能比较麻烦,但更加精细的控制可能更符合你的需求。



def clean_input_data(data):
    cleaned_data = data.replace('&','&')
    cleaned_data = cleaned_data.replace('<','<')
    cleaned_data = cleaned_data.replace('>','>')
    # do more replacement
    return cleaned_data

总之,这个问题的解决方案可能有多种,需要根据具体情况进行选择和调整。