2

我一直在查看 CherryPy 文档,但无法完全理解我想要做什么。我怀疑它可能更像是 Python 的东西而不是 CherryPy 的东西......

我现在的班级看起来像这样:

import managerUtils

class WebManager:
    def A(self, **kwds):
        return managerUtils.runAction("A", kwds)
    A.enabled = True

    def B(self, **kwds):
        return managerUtils.runAction("B", kwds)
    B.enabled = True

    def C(self, **kwds):
        return managerUtils.runAction("C", kwds)
    C.enabled = True

显然这里有很多重复。

在 managerUtils.py 中,我有一个类似于:

actions = {'A': functionToRunForA,
           'B': functionToRunForB,
           'C': functionToRunForC}

好的,这是一个稍微简单的观点,但我相信你明白了。

我希望能够做类似的事情:

import managerUtils

class WebManager:
    def __init__(self):
        for action in managerUtils.actions:
            f = registerFunction(action)
            f.enabled = True

关于如何做到这一点的任何想法?

一个答案建议这样做:

class WebManager:
    def index(self, action, **kwds):
        return managerUtils.runAction(action, kwds)
    index.enabled = True

这回升了,我相信:

http://webserver/?action&kwds

而不是我想要的,即:

http://webserver/action?kwds

当我按照您的建议进行操作时,出现以下 404 错误:

Traceback (most recent call last):
  File "/Library/Python/2.5/site-packages/cherrypy/_cprequest.py", line 606, in respond
    cherrypy.response.body = self.handler()
  File "/Library/Python/2.5/site-packages/cherrypy/_cperror.py", line 227, in __call__
    raise self
NotFound: (404, "The path '/myAction' was not found.")
4

1 回答 1

3
class WebManager:
    def default(self, action, **kwds):
        return managerUtils.runAction(action, kwds)
    default.exposed = True

关于为什么这与其他答案不同的两个注意事项:

  1. .exposed是发布方法的正确属性,而不是.enabled
  2. index方法是唯一不允许像“动作”这样的位置参数的方法。改用一种default方法。

希望有帮助!

于 2010-03-23T21:23:50.827 回答