在路由中重写具有正则表达式替换的URL

时间:2010-03-17 18:27:50

标签: python routes pylons

在我的Pylons应用中,某些内容位于看起来像http://mysite/data/31415的网址上。用户可以直接转到该URL,或通过搜索页面搜索“31415”。但是,我的约束意味着http://mysite/data/000031415应该转到与上面相同的页面,就像搜索“0000000000031415”一样。我可以在Routes本身中从该字符串中删除前导零,或者我是否需要在控制器文件中进行该替换?如果可以在routing.py中进行,我宁愿在那里做 - 但我无法从我正在阅读的文档中找到它。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

我知道我通过引入不同的路由库作弊,因为我没有使用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()