2015-04-06 67 views
0

沒有被發現在使用下面的代碼:元素 'html_block' 在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' 解決: '逃離',

+0

你用你的字典做什麼,最後發佈你處理字典的行! – HassenPy

回答

1

您發現了Python的降價的錯誤。具體而言,將safe_mode設置爲「轉義」並使用「額外」擴展名存在不兼容性。在底層,當safe_mode設置爲「轉義」時,解析器根本不插入找到所有HTML塊(名爲'html_block')的預處理器。之後,任何HTML都會被轉義,因爲它沒有被明確標記爲已知的安全HTML。但是,「額外」擴展嘗試修改'html_block'預處理器的行爲(以啓用「markdown = 1」行爲),並且因爲您在safe_mode中預處理器不存在並且失敗。更新:這不是問題,因爲這種情況是accounted for。如下所述,沒有錯誤只是用戶錯誤。

有趣的是,我注意到你有「額外」和「腳註」作爲擴展名列出。然而,「腳註」擴展是「額外」的一部分。換句話說,通過加載「額外」,您已經獲得「腳註」,不需要再次加載它。 「attr_list」也可以這樣說。這是導致錯誤的原因。試圖加載兩次相同的擴展。事實上,擴展其「額外」包括您的完整列表,可以發現here

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

你失去唯一通過加載每個這些擴展的獨立,而不是一起作爲「額外」部分更少的輸入和「markdown = 1」功能(它允許在原始HTML塊內解析Markdown)。有趣的是,如果您使用的是safe_mode,那麼「額外」的「markdown = 1」功能對您沒有用處。因此,除了加載「額外」,您可以簡單地加載上面列出的每個分機,然後safe_mode仍然可以工作。

也就是說,safe_mode正在deprecated並且將不再在下一個版本的Python-Markdown中可用。由於在發行說明中解釋,而不是使用safe_mode你應該通過傳遞不可信內容的HTML消毒劑(如Bleach)它是由降價轉換爲HTML後:

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

如果你這樣做,那麼你就可以在解析來自不受信任源的降價時仍然會獲得一些安全性,您不會遇到上述錯誤,並且您的代碼在未來的Python-Markdown版本中將繼續工作。