在 wagtail 中使外部链接在新窗口中打开

2023-11-26

我最近实现了添加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}),
    }

问题:

  1. 美丽的汤扰乱了输出,添加html, head & body tags - 不要自动添加 html、head 和 body 标签,beautifulsoup

  2. 它还与嵌入标签混淆 -如何让 BeautifulSoup 4 尊重自闭标签?

  3. 因此我的蹩脚“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(使用前将#替换为@)

在 wagtail 中使外部链接在新窗口中打开 的相关文章

随机推荐

  • 根据背景反转油漆颜色

    我正在写一个自定义进度条 我想创建类似的效果 其中 50 文本颜色动态更改为白色 而黑色条向右移动 使用 简单 的解决方案可能吗 我查阅了 PorterDuff ColorFilters xFermodes 似乎没有任何效果 有任何想法吗
  • 如何禁用 Servlet 3.0 扫描和自动加载组件

    我们有一个应用程序不断从我们的第 3 方库加载 ServletContainerInitializer 实例 一个实例是 JerseyServletContainerInitializer 另一个实例是 SpringServletConta
  • 没有任何焦点的按键绑定

    我有一个 WPF 屏幕 有六个按钮 我想将每个与键绑定相关联 它们都是通过 MVVM 驱动的 ICommand 我目前将键绑定绑定到事件而不是实际的按钮
  • 基于 PHP 的 HTML 验证器

    我需要找到一个基于 PHP 的 HTML 如 WC3 Like 验证器 它可以查找无效的 HTML 或 XHTML 我在谷歌上搜索了一下 但很好奇是否有人使用过他们特别喜欢的 我有一个字符串中的 HTML html 我希望能够测试该页面并让
  • 使用 RPATH 构建 OpenSSL?

    我有 Ubuntu 14 04 它附带了 openssl 1 0 1f 我想安装另一个openssl版本 1 0 2 并且我想自己编译它 我将其配置如下 LDFLAGS Wl export dynamic L home myhome pro
  • 如何在 C++ 中声明接口?

    如何设置代表接口的类 这只是一个抽象基类吗 扩展答案布拉德格默里 您可能希望通过添加虚拟析构函数来对接口的纯虚拟方法列表做出一个例外 这允许您将指针所有权传递给另一方 而无需公开具体的派生类 析构函数不必执行任何操作 因为该接口没有任何具体
  • 什么是差一错误以及如何修复它?

    什么是差一错误 如果我有 我该如何修复它 An 相差一误差例如 当您打算执行循环 n 次并编写如下内容时 for int i 1 i lt n i or for int i 0 i lt n i 在第一种情况下 将执行循环 n 1 次 在第
  • Flurry 分析在 Windows Phone 7 中崩溃

    我已将 Flurry http www flurry com 集成到我的 Phone 7 应用程序中 唯一需要的代码是应用程序启动中的这一行 FlurryWP7SDK Api StartSession ApiKeyValue 但是 一旦命中
  • 是否可以在不使用 foreach 的情况下重新创建此语句? [复制]

    这个问题在这里已经有答案了 可能的重复 C 具有继承的泛型类型的 Is 运算符 是否可以在不使用 foreach 语句的情况下将类类型从 Deal 更改为 Deal Bookmark Wrapper 时将一个列表添加到另一个列表中 var
  • Java服务重启4、5次

    我正在运行 Java 服务来轮询数据库中的数据 在我的班级中 我有一个线程 它每 5 秒在数据库中查找数据 在特定时间 比如下午 6 点非工作时间 我让线程休眠到某个配置的时间延迟 问题 当我让线程休眠时 似乎我的 Java 服务已重新启动
  • 编写我自己的通用地图函数

    我正在尝试编写自己的通用程序map功能和以下是我想出的 def map A B CC X lt Traversable X That xs CC A f A gt B implicit cbf CanBuildFrom CC B That
  • 角度在 url 中的哈希之前添加斜杠

    当我尝试在 url 中添加哈希时 例如 a href whatever whatever a or window location hash whatever 它在哈希世界之前附加一个 gt www mysite com whatever
  • 使滚动条出现在 RMarkdown 代码块中(html 视图)

    我正在使用 RStudio 和 knitr 制作 RMarkdown 文档 我希望打印代码块而不在我创建的 html 文件上包装文本 我是否缺少一个停止代码文本换行的选项 到目前为止 我只发现了有关如何remove滚动条 让我觉得最近可能发
  • 当用户选择记录时,推荐使用哪种方式填充 Web 表单上的所有控件?

    我有一个 GridView 控件 它显示所有员工的列表 当用户从此列表中选择任何员工时 记录将显示在 Web 表单上 所有输入控件都预先填充了值 我想知道有什么好的方法可以做到这一点 我应该将所有输入控件绑定到任何 SqlDataSourc
  • 如何更改 Eclipse 中导航器视图的背景颜色?

    我没有找到任何选项 所以我怀疑某些视图遵循操作系统的颜色模式 我目前使用的是 OS X 似乎更改默认背景颜色也是不可能的 我想要完成的是创建一个深色背景主题 但自定义似乎只能在某些日食视图上进行 对于 eclipse 使用 gtk 的平台
  • .NET 3.5 SP1 中的 XmlSerializer 更改

    我看过很多关于 NET 3 5 SP1 中的更改的帖子 但昨天偶然发现了一篇我尚未看到的文档 我的代码在我的机器上运行得很好 从 VS msbuild 命令行等等 但它在构建服务器 运行 NET 3 5 RTM 上失败了 XmlRoot f
  • 即使应用程序被删除后也能收到推送通知 iPhone

    我在我的应用程序中实现了推送通知 它运行良好 现在的问题是 即使我从设备中删除了我的应用程序 它仍然会收到推送通知 那么 当从设备中删除应用程序时 有什么方法可以从推送通知中注销该应用程序 希望得到您的帮助 提前致谢 在苹果推送通知中有一个
  • 内容 '\/Date('')\/' 未按照 JSON 的要求以 '\/Date(' 开头并以 ')\/' 结尾

    我想向 WCF 休息服务发送一个发布请求 如您所见 Guid id id Guid NewGuid var httpWebRequest HttpWebRequest WebRequest Create http localhost 470
  • 如何仅显示条形图的轮廓 matplotlib

    我将数据绘制为条形图绘图库我试图只显示条形的轮廓 以便它显示为数据的 阶梯图 我在下面添加了我的代码以及所需输出的图像 plt bar x y align center width 0 1 edgecolor black color non
  • 在 wagtail 中使外部链接在新窗口中打开

    我最近实现了添加target blank 到这样的外部链接 hooks register after edit page def do after page edit request page if hasattr page body so