2012-03-04 2 views
2

У меня такая проблема: я хочу, чтобы один метод класса обрабатывал разные URI (для URI «/ solution/add» и «solution/edit»). Поэтому я написал такую ​​маршрутизацию:webapp2: regex in routing

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

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

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

ответ

5

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

everything outside of <> is not interpreted as a regular expression to be matched

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

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

Это дает ошибку: ТипError: add_edit_solution() принимает ровно 1 аргумент (2 данных). Я думаю, что эта ошибка возникает, потому что это выражение предназначено для получения аргументов (например, «product_id» и т. Д.). – Dimitry

+0

@Dimitry, правильно. В чем проблема? Когда вы передаете регулярное выражение в 'Route', он вызывает обработчик с группами из регулярного выражения в качестве позиционных аргументов или как аргументы ключевого слова, если вы даете им имена. «[Имя, если определено] (http://webapp-improved.appspot.com/guide/routing.html#the-url-template), используется для создания URL-адресов для маршрута. Когда он установлен, значение согласованного регулярного выражения передается как ключевой аргумент обработчику, иначе он передается как позиционный аргумент. " Поэтому, если вы хотите использовать регулярное выражение здесь, вам нужно передать обработчик, который принимает * args или ** kwargs. Период. – senderle

+0

Ну, да) Это работает. Спасибо. В начале я думал по-другому реализовать это, я хотел реализовать это без каких-либо аргументов, но, как я вижу, теперь использование аргументов является лучшим способом. – Dimitry

0

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

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

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