如何防止 Wagtail CMS 中的同一页面编辑冲突?

How to prevent same page editing collision in Wagtail CMS?

我们有一个有多个编辑器的 Wagtail 站点,我想知道如何防止 Wagtail CMS 中的同一页面编辑冲突?

我知道 Wagtail 有一个内置的页面锁 source,但它会为所有人锁定页面并阻止所有编辑。

the ability to lock or unlock this page (and any pages underneath it) for editing, preventing users from making any further edits to it.

我发现 https://github.com/wagtail/wagtail/issues/448 似乎可以解决我的问题,但它已关闭但未解决。

我很想知道

  1. 如何使用 Wagtail CMS 防止两个或多个编辑者同时编辑同一页面?

或者如果 1. 太复杂而无法实现

  1. 如何检测页面编辑冲突并在 Wagtail UI 中警告编辑者他们可能正在编辑同一页面?

为了在版本前发出警告或完全阻止版本,我认为你现在最好的选择是before_edit_page hook (be careful though, it runs on both the GET and POST requests) given that it isn't possible to use custom page permissions

这仍然留给我们一个更大的问题,如何检测用户正在编辑页面?没有内置的东西,不幸的是,我认为没有简单的解决方案。以下是一些想法:

挂钩: 使用 before_edit_pageafter_edit_page 挂钩设置某种标志,我们称之为软锁。然而,这很快就失败了,如果用户关闭页面而不保存任何更改(永远不会调用 after_edit_page 并且永远不会删除软锁标志)怎么办?可以实施超时,但它仍然可能在有人编辑页面时超时(但只是需要很长时间)或者仍然会浪费一些人的时间,因为他们需要等待超时发生。

Ping: 注入一些 JavaScript(通过 insert_editor_js hook),它将使用当前用户和页面 ID ping 自定义端点。这可以使用比 hook & timeout 选项更精细的频率。

手动 创建一些自定义 soft-lock/soft-unlock 操作(通过 register_page_listing_buttons and register_page_listing_more_buttons hooks)以手动使用。

编辑:有一个有趣的新包,Wagtail-Websockets 可能正好解决这个问题。