Как избежать подпути внутри URL с помощью пирамиды - PullRequest
0 голосов
/ 07 декабря 2011

Мне нужно передать подпуть в качестве параметра в маршруте, созданном пирамидой.Я попытался использовать urllib.encode и urllib.quote, но в любом случае получил «ошибка не найдена».

генерация маршрута:

mypath='a/b/c'
new_route = route_url('new_model_route', self.request, subpath=urllib.encode(mypath))

мой маршрут:

config.add_route('new_model_route', '/model/new/{subpath}')

сгенерированный URL (с «ошибкой ресурса не найден»)

http://127.0.0.1:6544/rnd2/model/new/a%2Fb%2Fc

Я знаю, что это связано с экранированием, потому что URL http://blah/model/new/a работает.

1 Ответ

2 голосов
/ 07 декабря 2011

Шаблон маршрута /model/new/{subpath} никогда не будет соответствовать /model/new/a/b/c, поэтому я не понимаю, почему вы сможете сгенерировать URL для этого шаблона?

Возможно передать оставшуюся часть URLкак элементы, однако.

config.add_route('new_model_route', '/model/new/{subpath}')
request.route_url('new_model_route', 'b', 'c', subpath='a')
# /model/new/a/b/c

С другой стороны, у вас есть другой вариант.Вы можете создать новый маршрут для соответствия этим URL-адресам, например:

config.add_route('new_model_route', '/model/new/*subpath')
# matches /model/new/a, /model/new/a/b, etc

request.route_url('new_model_route', subpath=('a', 'b', 'c'))
# /model/new/a/b/c

Если вы по какой-то причине не хотите сопоставлять эти URL-адреса, вы можете добавить static=True к вызову add_routeЭто означает, что вы используете route name только для генерации URL-адресов, но не для их сопоставления во входящих запросах.

subpath и traverse являются специальными (это все задокументировано), но если выЕсли бы вы были склонны к использованию 'a / b / c', вы могли бы использовать что-то еще в шаблоне маршрута:

config.add_route('new_model_route', '/model/new/*rest')
# matches /model/new/a, /model/new/a/b, etc

request.route_url('new_model_route', rest='a/b/c')
# /model/new/a/b/c

О, и так как я в движении, вы можете использовать оригинальный подход с более простым URLкоторые вы уже можете иметь в вашей системе.

config.add_route('new_model_route', '/model/new')
# matches /model/new only

request.route_url('new_model_route', 'a', 'b', 'c')
# /model/new/a/b/c
...