龙卷风的Restful处理类
我在网上查了一下,发现了这个回答,它和我遇到的问题有点关系。不过我真正想知道的是,怎么实现这个结构,以及我需要多少个处理器类:
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’这个网址,我建议把它放在一个单独的处理器里,因为否则逻辑会变得太复杂。