签入事件后的 HTTP 重定向

HTTP redirect after check in event

我正在使用带有 plone.app.iterate 插件的 Plone 5.0 作为结帐选项和 intranet/extranet 工作流程。为了融合这两个概念,我的想法是: 每次工作流转换后,事件处理程序都会检查页面是否为工作副本以及是否为已发布页面。如果是这样,页面应该自动签入。 因此,在审查工作副本后,将其签入。 为了实现这一点,我编写了以下事件处理程序:

from Acquisition import aq_inner
from plone import api
from plone.app.iterate.interfaces import IWorkingCopy, ICheckinCheckoutPolicy
from plone.app.iterate import PloneMessageFactory as _
from Products.CMFCore.utils import getToolByName
from Products.statusmessages.interfaces import IStatusMessage

def checkInIfNeeded(document, event):
    context = aq_inner(document)
    workflowTool = getToolByName(context, "portal_workflow")
    status = workflowTool.getStatusOf("intranet_workflow", document)
    if IWorkingCopy.providedBy(context) and status["review_state"] == "internally_published":
       policy = ICheckinCheckoutPolicy(context)
       baseline = policy.checkin("")
       IStatusMessage(context.REQUEST).addStatusMessage(
        _("Checked in"), type='info')
       view_url = baseline.restrictedTraverse("@@plone_context_state").view_url()
       context.request.response.redirect(view_url)

签到代码几乎来自 source of the interface 这工作正常,直到触发事件的用户应该被重定向到页面的现在签入的主分支的最后一行。用户被重定向到工作副本的页面(现在不再存在),告诉用户该页面不可用。我做错了什么?

纯重定向调用在任何地方都不起作用,因为其他重定向可以稍后调用(它们永远不会在事件处理程序中起作用)。

尝试添加:

from zExceptions import Redirect

并将最后一行更改为:

raise Redirect(view_url)

我不确定您是否还必须在重定向调用之前从 transaction 模块添加 transaction.commit()