2

私はCherryPyのドキュメントを見回してきましたが、私がやりたいことについて頭を悩ませることはできません. 私はそれがCherryPyのものよりもPythonのものかもしれないと思う...

私の現在のクラスは次のようになります。

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 には、次のような dict があります。

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

これを行う方法のアイデアはありますか?

1つの答えは、次のことを提案しました:

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

これが他の回答と異なる理由についての 2 つの注意事項:

  1. .exposedメソッドを公開するための正しい属性です。.enabled
  2. メソッドは、 「アクション」のような位置引数を許可しないindex唯一のメソッドです。代わりにメソッドを使用してください。default

それが役立つことを願っています!

于 2010-03-23T21:23:50.827 に答える