1

Tornado使用派生自tornado.web.RequestHandler定义postget方法的类。我为路径创建了一个请求处理程序r/action/*

由于有不同的更具体的路径,例如action/doThisaction/requestThatget使用 if-then-else 结构检查具体请求 URI 来构建该方法。

这似乎很笨拙,是否有更复杂的方法来构建它,例如使用方法?或者 Tornado 的方式是定义更多的 RequestHandlers 吗?我喜欢bottle使用 Function Decorators 的方式,但由于它们是 Python 3,目前这不是一个选项。

4

2 回答 2

5

装饰器不仅限于 Python 3;我bottle经常使用 2.7(我更喜欢装饰器语法和更轻量级的bottle原型接口,或者当我发现我的实现不需要基于类的行为时Tornado)。

也就是说,如果action/doThis提供action/requestThat不同的行为,将它们定义为单独的路线会更好吗?如果他们共享他们行为的某些方面,您总是可以让两个RequestHandler子类共享一个共同的基础。

class HandleAction(tornado.web.RequestHandler):
    def take_appropriate_action(route):
        print("Responding to action/{}".format(route))


class HandleThis(HandleAction):
    def get(self):
        self.take_appropriate_action('doThis')


class HandleThat(HandleAction):
    def get(self):
        self.take_appropriate_action('requestThat')


app = tornado.web.Application([
    (r'/action/doThis', HandleThis),
    (r'/action/requestThat', HandleThat)
])
于 2012-12-26T19:39:50.987 回答
1

类似的问题和我同意的第一个答案。由于 Tornado 提供的功能缺乏,您必须推出自己的解决方案或使用像Tornado Addons这样的东西,这将减轻创建必要的处理程序及其相关路由的烦恼。

from tornado_addons.route import route

@route( "/action/doThis" )
class HandleDoThis( Request ):
 pass

@route( "/action/requestThat" )
class HandleRequestThat:
 pass

app = tornado.web.Application( route.get_routes() )

这将使为每个 RESTful 资源创建单独的处理程序类变得更加可行。这将消除您对if陈述的担忧。

于 2012-12-26T20:21:37.243 回答