不好意思问,但我正在使用 webapp2,我正在模板化一个解决方案,以便更容易地根据这个 google webapp2 路由功能定义路由。但这一切都取决于能够TYPE_NAME
在子级别进行定义。这个想法是父母设置一切,孩子只需要实现该_list
功能。我遇到的问题TYPE_NAME
是没有,我需要它成为孩子。
#main WSGI is extended to have this function
class WSGIApplication(webapp2.WSGIApplication):
def route(self, *args, **kwargs):
def wrapper(func):
self.router.add(webapp2.Route(handler=func, *args, **kwargs))
return func
return wrapper
from main import application
class ParentHandler(RequestHandler):
TYPE_NAME = None
@application.route('/', name="list_%s" %TYPE_NAME)
def list(self):
return self._list()
class ChildHandler(ParentHandler):
TYPE_NAME = 'child'
def _list(self):
return []
我尝试了几个使用“类属性”的解决方案,但没有成功。打开其他想法,我基本上只需要子类继承装饰属性并执行它们。
编辑:
对于所有坐在座位边缘想知道我如何解决这个问题的人,我无法从装饰器中得到我需要的一切,所以我最终使用了一个元。我还添加了一个_URLS
参数以允许添加其他“路线”。它将 custom
功能映射到路线。真的很想使用装饰器,但无法让它工作。
class RequestURLMeta(type):
def __new__(mcs, name, bases, dct):
result = super(RequestURLMeta, mcs).__new__(mcs, name, bases, dct)
urls = getattr(result, '_URLS', {}) or {}
for k,v in urls.iteritems():
template = v.pop('template')
app.route(getattr(result, k), template, **v)
if getattr(result, 'TYPE_NAME', None):
app.route(result.list, result.ROOT_PATH, methods=['GET'],name="%s" % result.TYPE_NAME)
#other ones went here..
return result
class ParentHandler(RequestHandler):
__metaclass__ = RequestURLMeta
class ChildHandler(ParentHandler):
TYPE_NAME = 'child'
_URLS = { 'custom': '/custom', 'TYPE_NAME': 'custom_test' }
def _list(self):
return []
def custom(self): pass