我已经阅读了一下,找到了一个与此相关的问题的答案,但我真正想知道的是如何实现此结构以及需要多少个处理程序类:
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] +的单个处理程序,并为该项目(item / new和/ items / [0-9] + / edit)添加3个新处理程序。不利的一面是,对于单个资源有4个处理程序,这似乎是次佳的解决方案。
我对正确的路由/处理/ Web应用程序是非常陌生的,但是至少在开始学习某些东西之前,请先阅读一下。关于您路由处理程序的数量/方式,是否有更好的建议?
好吧,这在很大程度上是风格上的。在这种情况下,每个请求处理程序都代表从一个方法中删除一个if语句。我认为限制RequestHandlers的数量可能更清楚。我认为使用一个处理程序和三个路由可以实现最清晰的结果。
我还丢弃了您的项目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
然后可以像这样创建实际的应用程序:
tornado.web.application([ (r'/items$', ItemHandler), (r'/items/(\d+$)', ItemHandler), (r'/items/(\d+)/(edit)$', ItemHandler), ])
如果您想要’/ items / new’网址,那么我可能建议将其放在单独的处理程序中,因为否则会使逻辑过于复杂。