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

发布于 2024-12-19 22:06:13 字数 496 浏览 0 评论 0原文

我需要在 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 有效。

I need to pass a subpath as a param in a route generated by Pyramid. I tried using urllib.encode and urllib.quote but get a "resource could not be found error" either way.

route generation:

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

my route:

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

generated url (with "resource not found error")

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

I know it has to do with the escaping because the url http://blah/model/new/a works.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

情话墙 2024-12-26 22:06:13

路线模式 /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 调用,这意味着您仅使用路由名称来生成 url,而不是在传入请求中匹配它们。

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

The route pattern /model/new/{subpath} would never match /model/new/a/b/c so I don't understand why you would be able to generate a URL for that pattern?

It is possible to pass the rest of the url as elements, however.

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

On the other hand, you have another option. You can create a new route to match these urls, such as:

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

If you didn't actually want to match these URLs for some reason, you can add static=True to the add_route call, which means that you are only using the route name to generate urls but not to match them on incoming requests.

subpath and traverse happen to be special (this is all documented) but if you were hellbent on using 'a/b/c' you could use something else in the route pattern:

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

Oh and since I'm on a roll, you can use the original approach with a simpler url which you may already have in your system.

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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文