使用Plone调用grok.View时,self.redirect导致TypeError

时间:2013-02-04 21:39:25

标签: python plone grok

我一直在使用简单的grok和Plone 4.1.4。到目前为止,我尝试了从此处five.grok

获取的版本1.2.0和1.1.1的已知良好配置

我尝试将grok.View与重定向一起使用,每当运行重定向代码(self.redirect('url'))时,都会引发以下TypeError:

TypeError: redirect() got an unexpected keyword argument 'trusted'
> /home/alex/projects/eggs/grokcore.view-1.13.5-py2.6.egg/grokcore/view/components.py(50)redirect()
-> url, status=status, trusted=trusted)

我发现这个讨论涉及类似的问题,但没有真正的解决方案。 gmane

重现错误真的很容易,只需在grok.View派生类中有一个更新方法。

from five import grok
from Products.CMFCore.interfaces import ISiteRoot
class RedirectTest(grok.View):
    grok.context(ISiteRoot)
    grok.require('zope2.View')
    grok.name('testredirect')
    def update(self):
        self.redirect(self.url(''))
    def render(self):
        self.redirect(self.url(''))

2 个答案:

答案 0 :(得分:4)

要在Zope2平台上使用Grok(由Plone使用),您需要安装five.grok package的正确版本。

Grok是针对Zope Toolkit开发的,ZTK中的发布程序包与Zope2发布者提供的API略有不同。 five.grok弥合了这种差异。但是你需要有正确的版本才能做出正确的匹配。

对于Plone 4.1(Zope 2.13),请确保使用five.grok版本1.3.1或更新版本:

  
      
  • 修复重定向方法以使其正常工作。与Zope 3不同,它不支持信任。
  •   

如果要升级到Plone 4.2,则正确的版本引脚包含在随附的versions.cfg文件中。

答案 1 :(得分:2)

Martijn的回答是最正确的。但是,作为解决方法,如果您无法将生产环境中的five.grok版本升级到> = 1.3.1,则可以使用“self.request.response.redirect(url_string)”而不是“self.redirect(url_string)” ”。我知道,它太丑了,我建议只在这种条件下使用这种替代品。