Динамическое создание определений страниц в Cherrypy

Я просматривал документацию 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.")

person Hugh    schedule 23.03.2010    source источник
comment
Я думаю, что показ URL-адресов с «действием» в их путях в качестве примера сбивает с толку (особенно потому, что имя аргумента в предлагаемом решении также называется действием). В верхней части вопроса действия были «А», «Б», и «С». Таким образом, примеры должны были использовать один из них. Например: http://webserver/?B&kwds и http://webserver/B?kwds.   -  person nmgeek    schedule 14.04.2015


Ответы (1)


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

Два примечания о том, почему это отличается от других ответов:

  1. .exposed является правильным атрибутом для методов публикации, а не .enabled
  2. метод index — единственный, который не допускает позиционные аргументы, такие как «действие». Вместо этого используйте метод default.

Надеюсь, это поможет!

person fumanchu    schedule 23.03.2010
comment
Позвольте мне попробовать! Открытая/включенная вещь была опечаткой с моей стороны - моя первоначальная настройка (верхний блок моего вопроса) использовала открытую - я просто неправильно набрал, когда писал это в таком общем виде. Сейчас попробую по умолчанию - спасибо! - person Hugh; 24.03.2010
comment
Это помогает понять, что, как и index, default — это имя специального метода в классах обработчиков страниц CherryPy. Этого можно не знать, поскольку метод default мало освещается в документации CherryPy. Метод по умолчанию — это резервный метод, который вызывается, если ни один другой метод не соответствует URL-пути. Он соответствует частичному пути, связанному с его точкой монтирования. Оставшаяся несопоставленная часть пути передается в метод default в виде ряда позиционных аргументов. - person nmgeek; 14.04.2015