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