CherryPy工具声明失败

时间:2017-12-06 08:15:56

标签: python python-3.6 cherrypy

我正在尝试按照文档中的示例{@ 3}}向CherryPy工具箱声明一个新工具。

根据我写的例子:

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。

1 个答案:

答案 0 :(得分:1)

问题是对python(自上而下)的评估顺序的误解,在定义类时尚未定义工具。

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

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