Python 结构RESTful Tornado Web应用程序

Python 结构RESTful Tornado Web应用程序,python,design-patterns,tornado,Python,Design Patterns,Tornado,使用从tornado.web.RequestHandler派生的类来定义post和get方法。我已经为路径r/action创建了一个请求处理程序/* 因为有不同的更具体的路径,比如action/doThis和action/requests,所以我用if-then-else结构检查了get方法的具体请求URI 这看起来很笨拙,有没有一种更复杂的方法来构建它,比如用方法?或者Tornado的方法是定义更多的RequestHandler?我喜欢使用函数装饰器的方式,但由于它们是Python3,所以目前

使用从tornado.web.RequestHandler派生的类来定义post和get方法。我已经为路径r/action创建了一个请求处理程序/*

因为有不同的更具体的路径,比如action/doThis和action/requests,所以我用if-then-else结构检查了get方法的具体请求URI


这看起来很笨拙,有没有一种更复杂的方法来构建它,比如用方法?或者Tornado的方法是定义更多的RequestHandler?我喜欢使用函数装饰器的方式,但由于它们是Python3,所以目前这不是一个选项。

装饰器不限于Python3;我经常在2.7中使用瓶子,我更喜欢装饰语法和瓶子的轻量级,当我创建接口原型时,或者当我发现我的实现不需要Tornado的基于类的行为时

也就是说,如果action/doThis和action/Requests提供不同的行为,那么将它们定义为单独的路由会更好吗?如果它们共享其行为的某些方面,则始终可以让两个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)
])

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

也就是说,如果action/doThis和action/Requests提供不同的行为,那么将它们定义为单独的路由会更好吗?如果它们共享其行为的某些方面,则始终可以让两个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)
])
第一个答案我同意。由于Tornado缺乏提供的功能,您必须推出自己的解决方案或使用类似somnething的解决方案,这样可以减轻创建必要的处理程序及其相关路线的麻烦

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语句的担忧。

我同意第一个答案。由于Tornado缺乏提供的功能,您必须推出自己的解决方案或使用类似somnething的解决方案,这样可以减轻创建必要的处理程序及其相关路线的麻烦

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语句的担忧