2010-03-23 2 views
2

Я просматривал документацию CherryPy, но не могу понять, что я хочу делать. Я подозреваю, что это могло бы быть больше Python вещи, чем CherryPy вещь ...Динамическое создание определений страниц в 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, у меня есть 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 

Любые идеи о том, как это сделать?

Один ответ предложил делать:

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.") 
+0

Я думаю, что отображение URL-адресов с «действием» в их путях в качестве примера путается (тем более, что имя аргумента в предлагаемом решении также называется действием.) В верхней части вопроса были «A», B 'и' C '. Поэтому примеры должны были использовать один из них. Например: 'http: // webserver /? B & kwds' и' http: // webserver/B? Kwds'. – nmgeek

ответ

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

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

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

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

+0

Позвольте мне дать вам один! Открытая/включенная вещь была опечаткой с моей стороны - моя первоначальная настройка (верхний блок моего вопроса) использовала «выставленную» - я просто неправильно набирал ее при написании этого общего характера. Дает «дефолт» а сейчас - спасибо! – Hugh

+0

Работает чудесно - спасибо за помощь! – Hugh

+0

Это помогает понять, что _index_, _default_ - это специальное имя метода в классах обработчиков страниц CherryPy. Это может не знать об этом, поскольку метод _default_ мало освещен в документации CherryPy. Метод _default_ - это метод возврата, который вызывается, если другой метод не соответствует пути URL.Он соответствует частичному пути, связанному с точкой монтирования. Оставшаяся, непревзойденная часть пути передается в метод _default_ как ряд позиционных аргументов. – nmgeek