元素html_block未在OrderedDi中找到

2024-06-12 00:38:42 发布

您现在位置:Python中文网/ 问答频道 /正文

使用以下代码时:

 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\u mode”:“escape”解决


Tags: 代码inmodeversionusrlocalexceptionextensions
1条回答
网友
1楼 · 发布于 2024-06-12 00:38:42

您在Python Markdown中发现了一个bug。具体来说,将safe_mode设置为“escape”和使用“extra”扩展之间存在不兼容。在引擎盖下,当safe_mode设置为“escape”时,解析器不会插入查找所有HTML块的预处理器(称为“htmlu块”)。之后,任何HTML都会被转义,因为它没有被特别标记为已知的安全HTML。但是,“extra”扩展试图修改“html\u block”预处理器的行为(以启用“markdown=1”行为),并且因为您在safe_mode中,所以该预处理器不存在并且失败。Update:这不是问题所在,因为这种情况是accounted for。没有错误,只是如下所述的用户错误。你知道吗

有趣的是,我注意到你的“额外”和“脚注”都列为扩展名。然而,“脚注”的扩展是“额外”的一部分。换句话说,通过加载“extra”,您已经得到了“footnotes”,不需要再次加载。“属性列表”也是如此。这就是导致错误的原因。尝试两次加载相同的扩展。实际上,“extra”为您提供的扩展的完整列表可以在here中找到:

  • Abbreviations
  • Attribute Lists
  • Definition Lists
  • Fenced Code Blocks
  • Footnotes
  • Tables
  • Smart Strong

作为“extra”的一部分,通过单独加载每个扩展而不是全部加载,唯一的问题是更少的键入和“markdown=1”特性(允许在原始HTML块中解析markdown)。有趣的是,如果您正在使用safe_mode,那么“extra”的“markdown=1”特性对您没有任何用处。因此,您不必加载“extra”,只需加载上面列出的每个扩展,然后safe_mode仍然可以工作。你知道吗

也就是说,safe_mode正在deprecated并且在Python Markdown的下一个版本中将不再可用。如发行说明中所述,在通过标记将不受信任的内容转换为HTML之后,不应使用safe_mode,而应通过HTML清理程序(如Bleach)传递不受信任的内容:

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

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

相关问题 更多 >