Ваш код не работает, потому что вы пытаетесь перенаправить на не связанные методы.Не связанные методы не имеют ссылки на self
, как они могли бы, если экземпляр App
не был создан?
Если вы хотите перенаправить методы класса, сначала вы должны инициализировать вашclass, а затем bottle.route()
к методам этого объекта, например:
import bottle
class App(object):
def __init__(self,param):
self.param = param
def index1(self):
return("I'm 1 | self.param = %s" % self.param)
myapp = App(param='some param')
bottle.route("/1")(myapp.index1)
Если вы хотите прикрепить определения маршрутов рядом с обработчиками, вы можете сделать что-то вроде этого:
def routeapp(obj):
for kw in dir(app):
attr = getattr(app, kw)
if hasattr(attr, 'route'):
bottle.route(attr.route)(attr)
class App(object):
def __init__(self, config):
self.config = config
def index(self):
pass
index.route = '/index/'
app = App({'config':1})
routeapp(app)
Не выполняйте часть bottle.route()
в App.__init__()
, потому что вы не сможете создать два экземпляра класса App
.
Есливам больше нравится синтаксис декораторов, чем установка атрибута index.route=
, вы можете написать простой декоратор:
def methodroute(route):
def decorator(f):
f.route = route
return f
return decorator
class App(object):
@methodroute('/index/')
def index(self):
pass