龙卷风宁静的处理程序类

odg*_*rim 11 python rest tornado handlers

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

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
Run Code Online (Sandbox Code Playgroud)

我在想2,5,7映射到一个处理程序路由到/ items/[0-9] +并且有3个新的处理程序用于items,items/new和/ items/[0-9] +/edit.缺点是它感觉像是一个次优解决方案,可以为单个资源提供4个处理程序.

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

ayc*_*dee 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
Run Code Online (Sandbox Code Playgroud)

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

tornado.web.application([
    (r'/items$', ItemHandler),
    (r'/items/(\d+$)', ItemHandler),
    (r'/items/(\d+)/(edit)$', ItemHandler),
])
Run Code Online (Sandbox Code Playgroud)

如果你想要'/ items/new'网址,那么我可能会建议把它放在一个单独的处理程序中,否则会使逻辑变得过于复杂.