如何在Pyramid中转义URL中的子路径

0 投票
1 回答
1153 浏览
提问于 2025-04-17 07:51

我需要在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 来生成网址,而不是用它来匹配传入的请求。

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

撰写回答