webapp2: регулярное выражение в маршрутизации

У меня такая проблема: я хочу, чтобы один метод класса обрабатывал разные URI (для URI "/solution/add" и "solution/edit"). Так я написал такую ​​маршрутизацию:

app = webapp2.WSGIApplication([webapp2.Route(r'/solutions/(add|edit)', handler='solution.SolutionPage:add_edit_solution'), ], debug=True)

И webapp2 выдает ошибку 404. Не могли бы вы предложить решение этой проблемы?

Конечно, я могу написать разные маршруты для каждого URI, но это не так интересно.)

2 ответа

Решение

Как показывают документы webapp2, вы должны поместить регулярное выражение в угловые скобки с двоеточием, разделяющим имя и выражение. Название не обязательно, но

все, что находится за пределами <>, не интерпретируется как регулярное выражение для сопоставления

Так что-то вроде этого: '/blog/<:\d{4}>/<:\d{2}>' Или в вашем случае это:

webapp2.Route(r'/solutions/<:(add|edit)>',
              handler='solution.SolutionPage:add_edit_solution')

Если я могу что-то добавить. Для моих собственных целей я пытаюсь создать обработчик, который выполняет немного похожую операцию, но дело в том, что я использовал self.request.host или self.request.route вместо аргументов.

Сделав это, и проанализировав результат с помощью регистра переключателя или цикла / elif / else, я могу создать класс с именем URIHandler, который будет использоваться для маршрутизации любого типа запроса на правильные ресурсы (даже страницы ошибок 404/500/yyy) динамически, без необходимости переписывать или добавлять маршрут для каждого нового ресурса.

Поэтому мне будет интересно сравнить два метода, чтобы немного их сравнить.

Другие вопросы по тегам