如何使用Pyramid转义URL内的子路径

时间:2011-12-07 01:23:09

标签: python url routes pyramid

我需要在Pyramid生成的路径中将子路径作为参数传递。我尝试使用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}')

生成的网址(“资源未找到错误”)

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

我知道它与转义有关,因为网址http://blah/model/new/a有效。

1 个答案:

答案 0 :(得分:2)

路由模式/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

另一方面,你有另一种选择。您可以创建匹配这些网址的新路线,例如:

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

如果由于某种原因您实际上并不想匹配这些网址,可以将static=True添加到add_route来电,这意味着您只使用route name生成网址,但不会在传入的请求中匹配它们。

subpathtraverse碰巧是特殊的(这都是记录在案的)但如果您对使用'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

哦,因为我在滚动,你可以使用原始方法和你系统中已有的更简单的网址。

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