在 OrderedDict 中找不到元素 'html_block'
Element 'html_block' was not found in OrderedDict
使用以下代码时:
MARKDOWN_KWARGS = {
'extensions': [
'footnotes',
'attr_list',
'headerid',
'extra',
'codehilite',
],
'safe_mode': 'escape',
我收到以下错误:
Django Version: 1.6.11
Exception Type: ValueError
Exception Value:
Element 'html_block' was not found in OrderedDict
Exception Location: /usr/local/lib/python2.7/site-packages/markdown/odict.py in index, line 149
Python Executable: /usr/local/bin/python
Python Version: 2.7.9
为什么?我能做些什么来解决它?
已通过删除 'safe_mode' 解决:'escape',
您在 Python-Markdown 中发现了一个错误。具体来说,将 safe_mode
设置为 "escape" 与使用 "extra" 扩展之间存在不兼容性。在引擎盖下,当 safe_mode
设置为 "escape" 时,解析器根本不会插入找到所有 HTML 块(名为 'html_block')的预处理器。之后,任何 HTML 都会被转义,因为它没有明确标记为已知安全 HTML。但是,"extra" 扩展试图修改 'html_block' 预处理器的行为(以启用 "markdown=1" 行为),并且由于您在 safe_mode
中,预处理器不存在它失败了。更新:这不是问题,因为这种情况是 accounted for。没有错误,只是用户错误,如下所述。
有趣的是,我注意到您将 "extra" 和 "footnotes" 都列为扩展名。但是,"footnotes" 扩展名是 "extra" 的一部分。换句话说,通过加载 "extra" 您已经获得 "footnotes" 并且不需要再次加载它。 "attr_list" 也是如此。这就是导致错误的原因。尝试加载相同的扩展程序两次。事实上,"extra" 包含的完整扩展列表可以在 here:
中找到
- Abbreviations
- Attribute Lists
- Definition Lists
- Fenced Code Blocks
- Footnotes
- Tables
- Smart Strong
作为 "extra" 的一部分,单独加载这些扩展中的每一个而不是一起加载,唯一让你失去的是更少的输入和 "markdown=1" 特性(它允许 Markdown 在原始 HTML 块)。有趣的是,如果你使用的是 safe_mode
,那么 "extra" 的 "markdown=1" 特性对你来说是没有用的。因此,您可以简单地加载上面列出的每个单独的扩展,而不是加载 "extra",然后 safe_mode
仍然可以工作。
也就是说,safe_mode
被markdown转换为HTML后就是deprecated and will no longer be available in the next release of Python-Markdown. As explained in the the release notes, rather than using safe_mode
you should be passing untrusted content through an HTML sanitizer (like Bleach):
import bleach
html = bleach.clean(markdown.markdown(text), **MARKDOWN_KWARGS)
如果你这样做,那么在解析来自不受信任来源的 markdown 时仍然可以获得一些安全性,你不会遇到上述错误,并且你的代码将在 [=59= 的未来版本中继续工作]-降价.
使用以下代码时:
MARKDOWN_KWARGS = {
'extensions': [
'footnotes',
'attr_list',
'headerid',
'extra',
'codehilite',
],
'safe_mode': 'escape',
我收到以下错误:
Django Version: 1.6.11
Exception Type: ValueError
Exception Value:
Element 'html_block' was not found in OrderedDict
Exception Location: /usr/local/lib/python2.7/site-packages/markdown/odict.py in index, line 149
Python Executable: /usr/local/bin/python
Python Version: 2.7.9
为什么?我能做些什么来解决它?
已通过删除 'safe_mode' 解决:'escape',
您在 Python-Markdown 中发现了一个错误。具体来说,将 更新:这不是问题,因为这种情况是 accounted for。没有错误,只是用户错误,如下所述。safe_mode
设置为 "escape" 与使用 "extra" 扩展之间存在不兼容性。在引擎盖下,当 safe_mode
设置为 "escape" 时,解析器根本不会插入找到所有 HTML 块(名为 'html_block')的预处理器。之后,任何 HTML 都会被转义,因为它没有明确标记为已知安全 HTML。但是,"extra" 扩展试图修改 'html_block' 预处理器的行为(以启用 "markdown=1" 行为),并且由于您在 safe_mode
中,预处理器不存在它失败了。
有趣的是,我注意到您将 "extra" 和 "footnotes" 都列为扩展名。但是,"footnotes" 扩展名是 "extra" 的一部分。换句话说,通过加载 "extra" 您已经获得 "footnotes" 并且不需要再次加载它。 "attr_list" 也是如此。这就是导致错误的原因。尝试加载相同的扩展程序两次。事实上,"extra" 包含的完整扩展列表可以在 here:
中找到
- Abbreviations
- Attribute Lists
- Definition Lists
- Fenced Code Blocks
- Footnotes
- Tables
- Smart Strong
作为 "extra" 的一部分,单独加载这些扩展中的每一个而不是一起加载,唯一让你失去的是更少的输入和 "markdown=1" 特性(它允许 Markdown 在原始 HTML 块)。有趣的是,如果你使用的是 safe_mode
,那么 "extra" 的 "markdown=1" 特性对你来说是没有用的。因此,您可以简单地加载上面列出的每个单独的扩展,而不是加载 "extra",然后 safe_mode
仍然可以工作。
也就是说,safe_mode
被markdown转换为HTML后就是deprecated and will no longer be available in the next release of Python-Markdown. As explained in the the release notes, rather than using safe_mode
you should be passing untrusted content through an HTML sanitizer (like Bleach):
import bleach
html = bleach.clean(markdown.markdown(text), **MARKDOWN_KWARGS)
如果你这样做,那么在解析来自不受信任来源的 markdown 时仍然可以获得一些安全性,你不会遇到上述错误,并且你的代码将在 [=59= 的未来版本中继续工作]-降价.