Ответ 1
Ну, это в значительной степени стилистично. Каждый обработчик запросов в этой ситуации представляет собой удаление инструкции if из одного из ваших методов. я думаю это может быть более четким, чтобы ограничить количество RequestHandlers. Самый чистый результаты, я думаю, могут быть достигнуты с помощью одного обработчика и трех маршрутов.
Я также выбросил ваш предмет 3. Потому что это дублирование пункта 6. Если наличие URL-адреса "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' url, то я бы предположил, отдельный обработчик, потому что в противном случае логика слишком сложна.