我已经阅读并找到this answered question关于与此相关的问题,但我真正想知道的是如何实现此结构以及我需要多少个处理程序类:
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] + /编辑。缺点是,对于单个资源而言,它感觉像是一个次优解决方案。
我对正确的路由/处理/ webapps非常陌生,但在开始之前我至少给它一个很好的阅读。您有多少/如何路由您的处理程序,是否有更好的建议?
答案 0 :(得分: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
然后可以像这样创建实际的应用程序:
tornado.web.application([
(r'/items$', ItemHandler),
(r'/items/(\d+$)', ItemHandler),
(r'/items/(\d+)/(edit)$', ItemHandler),
])
如果你想要' / items / new' url然后我可能会建议把它放进去 一个单独的处理程序,因为否则会使逻辑变得过于复杂。