webapp2:路由正则表达式

问题描述:

我有这样一个问题:我想要一个类的方法来处理不同的URI(对于URI“/解决方案/添加”和“解决方案/编辑”)。所以我写了这样的路由:webapp2:路由正则表达式

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

而webapp2给出404错误。你能否建议解决这个问题?

Ofcourse我可以写不同的路线,每URI,但它不是那么有趣。)

随着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

它给出了一个错误: TypeError:add_edit_solution()只需要1个参数(给定2)。 我认为这个错误发生是因为这个表达式用于获取参数(比如“product_id”等)。 – Dimitry 2012-03-04 21:02:50

+0

@Dimitry,正确。有什么问题?当你将一个正则表达式传递给'Route'时,它将使用正则表达式的组作为位置参数或者如果你给它们命名的关键字参数。 “[名称(如果已定义)](http://webapp-improved.appspot.com/guide/routing.html#the-url-template)用于为路由创建URL。设置该值时,值的匹配正则表达式作为关键字参数传递给处理函数,否则它作为位置参数传递。“所以如果你想在这里使用正则表达式,你必须传递一个接受* args或** kwargs的处理函数。期。 – senderle 2012-03-04 21:32:14

+0

嗯,是的)它的工作原理。谢谢。在开始时我以不同的方式来实现这一点,我想实现这个没有任何争论,但正如我现在看到使用参数是更好的方法。 – Dimitry 2012-03-05 07:00:00

如果我可以补充一下。 为了我自己的目的,我尝试创建一个执行一些类似操作的处理程序,但重点是我使用了self.request.host或self.request.route而不是参数。

这样做,并用switch case或if/elif/else循环解析结果,允许我创建一个名为URIHandler的类,用于将任何类型的请求路由到正确的资源(即使是404/500/yyy错误页面)动态地不必为每个新资源重写或添加路由。

所以我会有兴趣比较两种方法来对它们进行一些修改。