Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x cherrypy文档中的Mako渲染配方不起作用。怎么了?_Python 3.x_Cherrypy - Fatal编程技术网

Python 3.x cherrypy文档中的Mako渲染配方不起作用。怎么了?

Python 3.x cherrypy文档中的Mako渲染配方不起作用。怎么了?,python-3.x,cherrypy,Python 3.x,Cherrypy,我已经从Cherrypy docs的Mako渲染配方中复制粘贴了工具和插件文件,但它根本无法开箱即用 我试图跟踪问题,显然,在调用Mako工具之前调用了response.finalize()方法,该工具修改了response.body字典并向模板提供了错误的输入。如果工具配置了“before_finalize”选项,为什么会发生这种情况 另一件奇怪的事情是,我需要在普通处理程序中手动将response.status设置为200,而不是其他 我正在使用Python-3.4.3和Cherrypy-3

我已经从Cherrypy docs的Mako渲染配方中复制粘贴了工具和插件文件,但它根本无法开箱即用

我试图跟踪问题,显然,在调用Mako工具之前调用了response.finalize()方法,该工具修改了response.body字典并向模板提供了错误的输入。如果工具配置了“before_finalize”选项,为什么会发生这种情况

另一件奇怪的事情是,我需要在普通处理程序中手动将response.status设置为200,而不是其他


我正在使用Python-3.4.3和Cherrypy-3.7.0。

@saaj的帮助下,通过查看Cherrypy源代码,我得出结论,配方不再正确。我的猜测是,由于它已经有几年的历史了,新版本中的更改可能会导致该配方无法使用。这是基于以下事实:

  • 我观察到,公开的处理程序返回的字典被转换成一个列表(在我的基本测试中),因此呈现程序没有收到它应该收到的内容

  • json_out工具使用不同的方法,这实际上与HandlerWrapperTool非常相似。它的钩子点是'before_handler',而不是'before_finalize'

  • 需要在公开的处理程序中设置response.status,而不是发生什么


因此,最后,我将使用发布的代码片段,但我也可以使用更简单的代码片段,例如。

看起来像是重复的。@saaj我已经看过那篇文章了,虽然我猜它是有效的,但如果您能解释一下与配方中更清晰易读的形式不同的原因,我将不胜感激。我还看到您需要手动调用处理程序?我解释了为什么我认为将模板工具拆分成一个工具和一个插件并通过总线进行通信是一种过度工程化的做法。但你可以不同意我的意见。还有一种约定优于配置的方法,即不为每个处理程序手动定义模板名称。它像
HandlerWrapperTool
一样包装处理程序,您只需应用该工具,它就会处理其余部分。+1表示好奇。事实上,这是一个Python3不兼容问题,您可以不再比较
int
NoneType
。这行代码有问题--
如果cherrypy.response.status>399
,因为在我看来,通常情况下,状态是
None
。如果您喜欢配方的设计,只需在条件前面加上
cherrypy.response.status和
。另外,您可能想在这里为Sylvain打开一个问题,让他知道他有一个bug。很好的一点,我不知道这是Python 3中的一个更改。我已经在Bitbucket回购中打开了一个问题(#1365),并指出了这个问题。然而,由于某种转换dict(第1点)的机制,我无法使用“before_finalize”装载点使配方工作。我希望有人能澄清是否有解决办法。目前,我已经整合了你的代码片段,效果非常好。