Классы для отдыха с торнадо

Я прочитал и нашел этот ответ на вопрос о проблеме, связанной с этим, но я действительно хочу знать, как реализовать эту структуру и сколько обработчиков классы, которые мне нужны:

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] +/редактировать. Недостатком является то, что он чувствовал себя как неоптимальное решение иметь 4 обработчика для одного ресурса.

Я ужасно новичок в правильной маршрутизации/обработке/webapps, но я хотя бы хорошо читаю, прежде чем начинать что-то. Есть ли какие-либо лучшие предложения о том, как много/как вы направляете своих обработчиков?

Ответ 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, то я бы предположил, отдельный обработчик, потому что в противном случае логика слишком сложна.