龙卷风的Restful处理类

12 投票
1 回答
7782 浏览
提问于 2025-04-17 06:32

我在网上查了一下,发现了这个回答,它和我遇到的问题有点关系。不过我真正想知道的是,怎么实现这个结构,以及我需要多少个处理器类:

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]+,然后再为items、items/new和/items/[0-9]+/edit各创建3个新的处理器。这样做的缺点是,感觉为一个资源准备4个处理器有点不太合理。

我对正确的路由、处理和网页应用程序还很陌生,但在开始之前我至少会认真阅读一下相关内容。有没有更好的建议,关于你们需要多少个处理器,或者你们是怎么路由的?

1 个回答

19

其实这主要是风格上的问题。在这种情况下,每个请求处理器就像是把你某个方法里的一个if语句去掉。我觉得限制请求处理器的数量会让代码更清晰。最清晰的结果我认为是用一个处理器和三个路由。

我还把你的第三项去掉了,因为它跟第六项重复了。如果‘items/new’这个网址真的很重要,那我们可以再加上。不过到那时候,你可能需要另一个处理器类来保持清晰。

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’这个网址,我建议把它放在一个单独的处理器里,因为否则逻辑会变得太复杂。

撰写回答