如何让 TurboGears 在路由时将 '%2F' 与 '/' 区别对待?

How to make TurboGears treat '%2F' differently from '/' when routing?

我有一个简单的 TurboGears 2 脚本,名为 app.py:

#!/usr/bin/env python3

from wsgiref.simple_server import make_server
from tg import expose, TGController, AppConfig

class RootController(TGController):
    @expose()
    def lookup(self, name):
        return name

config = AppConfig(minimal=True, root_controller=RootController())

print("Serving on port 5000...")
httpd = make_server('', 5000, config.make_wsgi_app())
httpd.serve_forever()

当我 运行 app.py 并访问 http://localhost:5000/lookup/dave, I see "dave" as expected. But when I visit http://localhost:5000/lookup/dave%2Fdavid 时,我收到 404 错误而不是 "dave/david"。似乎 TurboGears 将 'dave%2Fdavid' 分成两个单独的参数。

如何让 TurboGears 尊重转义斜线与非转义斜线的区别?

对于您的具体示例,您可以通过将 *args 添加到您的查找并根据它们加入名称来解决该问题:

class RootController(TGController):
    @expose()
    def lookup(self, *args):
        name = '/'.join(args)
        return name

在标准 WSGI 应用程序中无法区分 /%2F。有 a long argument about this in 2008,但 WSGI 规范的作者认为与 CGI 的兼容性——这两者也不区分——比让程序员决定如何解释 %2F.

最后我决定在构建路径时将 / 转换为 %252F,然后对从路径获得的每个变量进行 运行 replace('%2F', '/')。这不是一个非常优雅的解决方案,但除非 WSGI 作者改变主意,否则我看不到更好的选择。