Классы обработчиков торнадо - PullRequest
11 голосов
/ 18 ноября 2011

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

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 обработчика для одного ресурса.

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

1 Ответ

18 голосов
/ 12 сентября 2012

Ну, это в значительной степени стилистическое. Каждый обработчик запроса в этой ситуации представляет собой удаление оператора 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),
])

Если вам нужен URL '/ items / new', я, вероятно, рекомендую добавить это отдельный обработчик, потому что иначе это сделало бы логику слишком сложной.

...