龙卷风Restful处理程序类

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]+,然后为items、items/new和/items/[0-9]+/edit创建3个新的处理程序。缺点是感觉为单个资源使用4个处理程序不够优化。

我对正确的路由/处理/ Web应用程序非常陌生,但至少在开始处理之前我会好好阅读文档。是否有更好的建议,关于如何处理路由处理程序?


你能否刪除第3項並在其位置使用6?或者你特別想要一個/items/new嗎? - aychedee
1个回答

19

这主要是风格方面的问题。在这种情况下,每个请求处理程序都代表从您的方法中删除if语句。我认为限制RequestHandlers的数量可以更清晰地表达意思。我认为,通过一个处理程序和三个路线可以获得最清晰的结果。

我还放弃了你的第三项。因为它是第六项的重复。如果拥有“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,那么我建议将它放在一个单独的处理程序中,否则逻辑会变得过于复杂。

获取items/new表示创建新项目的表单。无论哪种情况,这都是我一年前决定采用的解决方案! - odgrim
哈!谢谢你回来并给它打了个勾。很高兴我能帮到你。 - aychedee
@aychedee 看了你的处理程序代码,你的路由应该遵循这种命名组的模式:(r'/items/(?P<item_id>\d+$)', ItemHandler)。这样可能会使你的示例更完整。 - Ethan
关于第三项,我不建议在GET方法上进行“写请求”。GET方法是用于“读请求”的。它不应该创建/更新数据。 - SanD
虽然我同意你的观点,但是(现在已经是四年前的事情了),当时我回答的是一个关于如何使用GET方法和编辑端点的问题。 - aychedee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接