我最近实现了添加target="_blank"
到这样的外部链接:
@hooks.register('after_edit_page')
def do_after_page_edit(request, page):
if hasattr(page, "body"):
soup = BeautifulSoup(page.body)
for a in soup.findAll('a'):
if hasattr(a, "href"):
a["target"] = "_blank"
page.body = str(soup)
page.body = page.body.replace("<html><head></head><body>", "")
page.body = page.body.replace("</body></html>", "")
page.body = page.body.replace("></embed>", "/>")
page.save()
@hooks.register('construct_whitelister_element_rules')
def whitelister_element_rules():
return {
'a': attribute_rule({'href': check_url, 'target': True}),
}
问题:
美丽的汤扰乱了输出,添加html, head & body
tags - 不要自动添加 html、head 和 body 标签,beautifulsoup
它还与嵌入标签混淆 -如何让 BeautifulSoup 4 尊重自闭标签?
因此我的蹩脚“fix
" 手动用空白字符串替换部分输出。
问题:
执行此操作的正确和最佳方法是什么?
从 Wagtail v2.5 开始,作为 Wagtail 富文本处理的一部分,有一个 API 可以进行如下自定义:Rewrite handlers,与register_rich_text_features hook.
下面是一个使用这个新 API 来创建重写处理程序的示例,该处理程序设置target="_blank"
所有外部链接的属性:
from django.utils.html import escape
from wagtail.core import hooks
from wagtail.core.rich_text import LinkHandler
class NewWindowExternalLinkHandler(LinkHandler):
# This specifies to do this override for external links only.
# Other identifiers are available for other types of links.
identifier = 'external'
@classmethod
def expand_db_attributes(cls, attrs):
href = attrs["href"]
# Let's add the target attr, and also rel="noopener" + noreferrer fallback.
# See https://github.com/whatwg/html/issues/4078.
return '<a href="%s" target="_blank" rel="noopener noreferrer">' % escape(href)
@hooks.register('register_rich_text_features')
def register_external_link(features):
features.register_link_type(NewWindowExternalLinkHandler)
在这个例子中我还添加了rel="noopener"
修复一个已知的安全问题 with target="_blank"
.
与之前针对此问题的解决方案相比,这种新方法是最可靠的:它完全是服务器端的,仅覆盖链接在网站前端的呈现方式而不是存储方式,并且仅依赖于记录的 API 而不是内部的那些/实施细节。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)