【问题标题】:Rewriting An URL With Regular Expression Substitution in Routes在路由中使用正则表达式替换重写 URL
【发布时间】:2025-12-26 15:40:10
【问题描述】:

在我的 Pylons 应用程序中,一些内容位于看起来像 http://mysite/data/31415 的 URL。用户可以直接访问该网址,也可以通过搜索页面搜索“31415”。然而,我的限制意味着http://mysite/data/000031415 应该转到与上面相同的页面,搜索“0000000000031415”也应该如此。我可以在 Routes 本身中从该字符串中去除前导零,还是需要在控制器文件中进行替换?如果可以在 routing.py 中执行此操作,我宁愿在此处执行此操作 - 但我无法从我正在阅读的文档中完全弄清楚。

【问题讨论】:

    标签: python routes pylons


    【解决方案1】:

    您实际上可以通过conditional functions 执行此操作,因为它们允许您从适当的 URL 修改变量。

    【讨论】:

      【解决方案2】:

      我知道我引入不同的路由库是在作弊,因为我没有使用过Routes,但这里是使用Werkzeug 的路由包的方法。它允许您指定路径的给定片段是整数。如果您想解析更有趣的内容(例如 UUID),还可以通过继承 werkzeug.routing.BaseConverter 来实现更专业的“转换器”。

      也许,Routes 有一个类似的机制来满足专​​门的路径片段解析需求。

      import unittest
      from werkzeug.routing import Map, Rule
      
      class RoutingWithInts(unittest.TestCase):
          m = Map([Rule('/data/<int:record_locator>', endpoint='data_getter')])
      
          def test_without_leading_zeros(self):
              urls = self.m.bind('localhost')
              endpoint, urlvars = urls.match('/data/31415')
              self.assertEquals({'record_locator': 31415}, urlvars)
      
          def test_with_leading_zeros(self):
              urls = self.m.bind('localhost')
              endpoint, urlvars = urls.match('/data/000031415')
              self.assertEquals({'record_locator': 31415}, urlvars)
      
      unittest.main()
      

      【讨论】:

      • 嗯。我可以尝试将路由变量强制转换为 int,这可能会起作用。感谢您的建议。
      • @Sean M,如果你在这里发布你的强制代码会有所帮助,这样其他在路线上有类似困难的人也会受益。
      • 我还没有开始工作,我怀疑这个方向可能没有成效。 :(