Django模板正在删除html表,不管使用安全还是自动转义



我正试图将一个包含html表的变量作为Django模板中的html表传递给它。

当我传递它并将其标记为|safe或关闭自动转义时。所有HTML都被插入,但表被完全删除,有人知道为什么以及如何关闭它吗?

import urllib.request
from bs4 import BeautifulSoup
tt_opener = urllib.request.build_opener()
tt_opener.addheaders = [('User-Agent', 'Mozilla/5.0')]
tt_service = tt_opener.open('https://managed.mytalktalkbusiness.co.uk/network-status/')
tt_soup = BeautifulSoup(tt_service, "html.parser")
tt_data = tt_soup.table

模板

<div id="TALK-TALK-Service" style="width:50vw; height:50vw; float:left;">
{{ TalkTalk |kksafe }}
</div>

通过shell 打印的tt_data变量

<table border="0" cellpadding="0" cellspacing="0" class="opaltable" width="100%"><th nowrap="nowrap"> </th><th nowrap="nowrap">Issue</th><th nowrap="nowrap">Services affected</th><th nowrap="nowrap">Location</th><th nowrap="nowrap">Last update</th><tr><td width="20"><img src="https://managed.mytalktalkbusiness.co.uk/images/redlight.gif"/></td><td width="350"><a href="https://managed.mytalktalkbusiness.co.uk/network-status-report.php?reportid=15462">incident 10574541 - Washington Exchange - no service</a></td><td>Extranet, Ethernet, EoFTTC &amp; EFM via TalkTalk, DSL via TalkTalk</td><td width="100">n/a</td><td nowrap="nowrap" width="150">11th Oct 2017 12:53</td></tr><tr><td width="20"><img src="https://managed.mytalktalkbusiness.co.uk/images/redlight.gif"/></td><td width="350"><a href="https://managed.mytalktalkbusiness.co.uk/network-status-report.php?reportid=15448">Incident 10573277 -  Network – P1 – Some TTB customers are experiencing Post Dial Delay  SIP/VOE</a></td><td>SIP/VOE</td><td width="100">n/a</td><td nowrap="nowrap" width="150">11th Oct 2017 12:27</td></tr></table>

网页上显示的html

<div id="TALK-TALK-Service" style="width:50vw; height:50vw; float:left;">
[&nbsp;, Issue, Services affected, Location, Last update, <img src="https://managed.mytalktalkbusiness.co.uk/images/redlight.gif"><a href="https://managed.mytalktalkbusiness.co.uk/network-status-report.php?reportid=15462">incident 10574541 - Washington Exchange - no service</a>Extranet, Ethernet, EoFTTC &amp; EFM via TalkTalk, DSL via TalkTalkn/a11th Oct 2017 12:53, <img src="https://managed.mytalktalkbusiness.co.uk/images/redlight.gif">, <img src="https://managed.mytalktalkbusiness.co.uk/images/redlight.gif">, <a href="https://managed.mytalktalkbusiness.co.uk/network-status-report.php?reportid=15462">incident 10574541 - Washington Exchange - no service</a>, <a href="https://managed.mytalktalkbusiness.co.uk/network-status-report.php?reportid=15462">incident 10574541 - Washington Exchange - no service</a>, Extranet, Ethernet, EoFTTC &amp; EFM via TalkTalk, DSL via TalkTalk, n/a, 11th Oct 2017 12:53, <img src="https://managed.mytalktalkbusiness.co.uk/images/redlight.gif"><a href="https://managed.mytalktalkbusiness.co.uk/network-status-report.php?reportid=15448">Incident 10573277 -  Network – P1 – Some TTB customers are experiencing Post Dial Delay  SIP/VOE</a>SIP/VOEn/a11th Oct 2017 12:27, <img src="https://managed.mytalktalkbusiness.co.uk/images/redlight.gif">, <img src="https://managed.mytalktalkbusiness.co.uk/images/redlight.gif">, <a href="https://managed.mytalktalkbusiness.co.uk/network-status-report.php?reportid=15448">Incident 10573277 -  Network – P1 – Some TTB customers are experiencing Post Dial Delay  SIP/VOE</a>, <a href="https://managed.mytalktalkbusiness.co.uk/network-status-report.php?reportid=15448">Incident 10573277 -  Network – P1 – Some TTB customers are experiencing Post Dial Delay  SIP/VOE</a>, SIP/VOE, n/a, 11th Oct 2017 12:27]
</div>

您的tt_soup变量是来自bs4的Tag对象,而不是字符串。您可以在视图中查看此项。

tt_soup = BeautifulSoup(tt_service, "html.parser")
print(type(tt_soup))

由于tt_soup对象是可调用的,Django模板语言在呈现表时会调用它,这会产生意外的结果。可以通过将tt_soup转换为视图中的字符串来防止这种情况。

tt_soup = BeautifulSoup(tt_service, "html.parser")
tt_soup = str(tt_soup)  #  unicode(tt_soup) in Python 2

可能有一种更合适的方法来调用tt_soup对象而不是str(),但我不知道,因为我对BeautifulSoup不是很熟悉。

最新更新