如何在Pyramid中转义URL中的子路径
我需要在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}')
生成的URL(出现“找不到资源”的错误)
http://127.0.0.1:6544/rnd2/model/new/a%2Fb%2Fc
我知道这跟转义有关,因为这个网址 http://blah/model/new/a
是可以正常工作的。
1 个回答
2
路由模式 /model/new/{subpath}
是无法匹配 /model/new/a/b/c
的,所以我不明白为什么你能为这个模式生成一个网址?
不过,确实可以把网址的其余部分作为元素传递。
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
如果你出于某种原因不想匹配这些网址,你可以在 add_route
的调用中添加 static=True
,这意味着你只是用 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