【问题标题】:Element 'html_block' was not found in OrderedDict [closed]在 OrderedDict 中找不到元素“html_block”[关闭]
【发布时间】:2015-06-11 04:09:16
【问题描述】:

使用以下代码时:

 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',

【问题讨论】:

  • 你想用你的 dict 做什么,至少发布你处理 dict 的行!

标签: python django markdown


【解决方案1】:

您在 Python-Markdown 中发现了一个错误。具体来说,将safe_mode 设置为“escape”和使用“extra”扩展名之间存在不兼容性。在后台,当safe_mode 设置为“转义”时,解析器根本不会插入找到所有 HTML 块(名为“html_block”)的预处理器。稍后,任何 HTML 都会被转义,因为它没有被明确标记为已知的安全 HTML。但是,“额外”扩展试图修改“html_block”预处理器的行为(以启用“markdown=1”行为),并且因为您在safe_mode 中,该预处理器不存在并且它失败了。 del>更新:这不是问题,因为这种情况是accounted for。没有错误,只是用户错误,如下所述。

有趣的是,我注意到您将“额外”和“脚注”列为扩展名。但是,“脚注”扩展名是“额外”的一部分。换句话说,通过加载“额外”,您已经获得了“脚注”,并且不需要再次加载它。 “attr_list”也可以这样说。这就是导致错误的原因。尝试加载相同的扩展两次。事实上,您可以在here找到“额外”包含的扩展的完整列表:

  • 缩写
  • 属性列表
  • 定义列表
  • 防护代码块
  • 脚注
  • 表格
  • 智能强

通过单独加载每个扩展而不是全部加载作为“额外”的一部分,您唯一松动的就是更少的输入和“markdown=1”功能(允许在原始 HTML 块中解析 Markdown)。有趣的是,如果您使用的是safe_mode,那么“extra”的“markdown=1”功能对您没有用处。因此,您可以简单地加载上面列出的每个单独的扩展,而不是加载“额外”,然后 safe_mode 仍然可以工作。

也就是说,safe_modedeprecated,并且在 Python-Markdown 的下一个版本中将不再可用。正如发行说明中所解释的那样,在通过 Markdown 将不受信任的内容转换为 HTML 之后,您应该通过 HTML sanitizer(如 Bleach)传递不受信任的内容,而不是使用 safe_mode

import bleach
html = bleach.clean(markdown.markdown(text), **MARKDOWN_KWARGS)

如果你这样做了,那么你在解析来自不受信任的来源的 Markdown 时仍然可以获得一些安全性,你不会遇到上述错误,并且你的代码将继续在 Python-Markdown 的未来版本中工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-29
    • 2017-03-30
    • 2021-04-03
    • 2021-08-12
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多