CherryPy 工具声明失败

Declaration of CherryPy Tool fails

我正在尝试按照文档中的示例向 CherryPy 工具箱声明一个新工具:Docs CherryPy Tools

根据我写的例子:

import cherrypy

def myTool():
    print ("myTool")

class Root(object):
    @cherrypy.expose
    @cherrypy.tools.mytool()
    def index(self):
        return "Hello World!"

if __name__ == '__main__':
    cherrypy.tools.mytool = cherrypy.Tool('before_finalize', myTool)
    cherrypy.quickstart(Root(), '/')

这会导致以下错误:

Traceback (most recent call last):
  File "server.py", line 6, in <module>
    class Root(object):
  File "server.py", line 8, in Root
    @cherrypy.tools.mytool()
  AttributeError: 'Toolbox' object has no attribute 'mytool'

但是,如果我将符号更改为以下,它会按预期工作。

import cherrypy

def myTool():
    print ("myTool")

class Root(object):
    @cherrypy.expose
    def index(self):
        return "Hello World!"
    index._cp_config = {'tools.mytool.on': True}

if __name__ == '__main__':
    cherrypy.tools.mytool = cherrypy.Tool('before_finalize', myTool)
    cherrypy.quickstart(Root(), '/')

文档说这两种方法的效果相同,但我的情况不同。如果有人知道我做错了什么,我将不胜感激。

该工具不应全局定义,因此使用 @cherrypy.tools.mytool() 表示法。

我正在使用 python 3.6.

问题是对python求值顺序的误解(自上而下),在定义class时工具还没有定义。

您可以在顶部的另一个文件导入中定义该工具(在 class 定义之前),它应该可以工作。

第二种形式有效,因为配置是使用配置中的字符串间接完成的,而不是真正的工具对象。