我正在尝试按照文档中的示例{@ 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。
答案 0 :(得分:1)
问题是对python(自上而下)的评估顺序的误解,在定义类时尚未定义工具。
您可以在顶部(在类定义之前)的另一个文件导入中定义该工具,它应该可以工作。
第二种形式有效,因为配置是使用配置中的字符串间接完成的,而不是真正的工具对象。