12

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

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]+/edit。不利的一面是,为单个资源设置 4 个处理程序感觉不是最佳解决方案。

我对正确的路由/处理/webapps 非常陌生,但我至少在开始做某事之前先好好阅读一下。对于处理程序的数量/方式是否有更好的建议?

4

1 回答 1

19

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

我也扔掉了你的第 3 项。因为它是第 6 项的重复项。如果有一个“项目/新”网址真的很重要,那么我们可以把它放回去。虽然我认为那时你需要另一个处理程序为了清晰起见。

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,那么我可能会建议将它放在一个单独的处理程序中,因为否则会使逻辑过于复杂。

于 2012-09-12T13:13:04.643 回答