在 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= 的未来版本中继续工作]-降价.