龙卷风宁静的处理程序类

时间:2011-11-18 00:09:58

标签: python rest tornado handlers

我已经阅读并找到this answered question关于与此相关的问题,但我真正想知道的是如何实现此结构以及我需要多少个处理程序类:

1  GET    /items        #=> index
2  GET    /items/1      #=> show
3  GET    /items/new    #=> new
4  GET    /items/1/edit #=> edit
5  PUT    /items/1      #=> update
6  POST   /items        #=> create
7  DELETE /items/1      #=> destroy

我在考虑将2,5,7映射到路由到/ items / [0-9] +的单个处理程序,并为项目设置3个新处理程序,items / new和/ items / [0-9] + /编辑。缺点是,对于单个资源而言,它感觉像是一个次优解决方案。

我对正确的路由/处理/ webapps非常陌生,但在开始之前我至少给它一个很好的阅读。您有多少/如何路由您的处理程序,是否有更好的建议?

1 个答案:

答案 0 :(得分:18)

嗯,这主要是风格。这种情况下的每个请求处理程序 表示从您的某个方法中删除if语句。我认为它 可以更清楚地限制RequestHandler的数量。最清楚的 结果我认为可以用一个处理程序和三个路由来实现。

我也扔掉了你的物品3.因为它是第6项的重复。如果 拥有' items / new' url非常重要,然后我们可以把它重新放入。 虽然我认为在那一点上你需要另一个处理程序类来清楚。

class ItemHandler(tornado.web.RequestHandler):

    def get(self, item_id=None, edit=False):
        if item_id:
            # get item from db
            if edit:
                new_data_from_query_string = self.get_argument('item_data')
                # do edit, save item
            # return item
        else:
            # return index

    def put(self, item_id):
        data = self.get_argument('item_data')
        # do your update for item

    def post(self):
        data = self.get_argument('item_data')
        # do your item creation

    def delete(self, item_id):
        # do your deletion for item_id

然后可以像这样创建实际的应用程序:

tornado.web.application([
    (r'/items$', ItemHandler),
    (r'/items/(\d+$)', ItemHandler),
    (r'/items/(\d+)/(edit)$', ItemHandler),
])

如果你想要' / items / new' url然后我可能会建议把它放进去 一个单独的处理程序,因为否则会使逻辑变得过于复杂。