我需要在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
有效。
答案 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
生成网址,但不会在传入的请求中匹配它们。
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
哦,因为我在滚动,你可以使用原始方法和你系统中已有的更简单的网址。
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