Перезапись URL с подстановкой регулярного выражения в маршрутах - PullRequest
1 голос
/ 17 марта 2010

В моем приложении Pylons некоторое содержимое располагается по URL-адресам, которые выглядят как http://mysite/data/31415. Пользователи могут перейти по этому URL-адресу напрямую или выполнить поиск по запросу «31415» на странице поиска. Мои ограничения, однако, означают, что http://mysite/data/000031415 должен перейти на ту же страницу, что и выше, как и поиск «0000000000031415». Могу ли я удалить начальные нули из этой строки в самом Routes, или мне нужно сделать эту замену в файле контроллера? Если это возможно сделать в routing.py, я бы предпочел сделать это там - но я не могу понять это из документации, которую я читаю.

Ответы [ 2 ]

1 голос
/ 01 октября 2010

На самом деле вы можете сделать это с помощью условных функций , поскольку они позволяют вам изменять переменные из URL на месте.

0 голосов
/ 17 марта 2010

Я знаю, что я обманываю, представляя другую библиотеку маршрутизации, поскольку я не использовал Routes, но вот как это делается с помощью пакета маршрутизации Werkzeug. Это позволяет вам указать, что данный фрагмент пути является целым числом. Вы также можете реализовать более специализированный «конвертер», унаследовав werkzeug.routing.BaseConverter, если вы хотите проанализировать что-то более интересное (например, UUID).

Возможно, 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()
...