【问题标题】:webapp2: regex in routingwebapp2:路由中的正则表达式
【发布时间】:2012-03-22 10:33:41
【问题描述】:

我有这样一个问题:我想要一个类的方法来处理不同的 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 编写不同的路由,但这并不那么有趣。)

【问题讨论】:

    标签: python regex webapp2


    【解决方案1】:

    正如webapp2 docs 所示,您必须将正则表达式放在尖括号中,并用冒号分隔名称和表达式。名称是可选的,但是

    之外的所有内容都不会被解释为要匹配的正则表达式

    所以是这样的:'/blog/<:\d{4}>/<:\d{2}>' 或者在你的情况下,这个:

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

    【讨论】:

    • 它给出了一个错误:TypeError: add_edit_solution() 只需要 1 个参数(给定 2 个)。我认为发生此错误是因为此表达式用于获取参数(例如“product_id”等)。
    • @Dimitry,正确。有什么问题?当您将正则表达式传递给Route 时,它会使用正则表达式中的组作为位置参数调用处理程序,或者如果您给它们命名,则作为关键字参数调用处理程序。 “The name, if defined,用于为路由构建 URL。设置时,匹配的正则表达式的值作为关键字参数传递给处理程序。否则,它作为位置参数传递。”所以如果你想在这里使用正则表达式,你必须传递一个接受 *args 或 **kwargs 的处理程序。期间。
    • 嗯,是的)它有效。谢谢你。一开始我想用不同的方式来实现它,我想在没有任何参数的情况下实现它,但我现在看到使用参数是更好的方法。
    【解决方案2】:

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

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

    所以我有兴趣比较这两种方法来稍微调整一下。

    【讨论】:

      猜你喜欢
      • 2013-02-17
      • 2015-07-09
      • 1970-01-01
      • 2013-03-17
      • 2015-10-21
      • 1970-01-01
      • 1970-01-01
      • 2020-10-10
      • 2019-01-01
      相关资源
      最近更新 更多