TurboGears 在 URL 中替换了哪些字符?

Which characters does TurboGears replace in the URL?

我有一个简单的 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 all__things(self):
        return "Hello world!"

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/all__things 时,我按预期看到了 "Hello world!"。但这些网址也有效:

http://localhost:5000/all--things
http://localhost:5000/all@@things
http://localhost:5000/all$$things
http://localhost:5000/all++things
http://localhost:5000/all..things
http://localhost:5000/all,,things

以及组合:

http://localhost:5000/all-_things
http://localhost:5000/all_-things
http://localhost:5000/all-@things
http://localhost:5000/all@-things
http://localhost:5000/all$@things
http://localhost:5000/all@$things

等等...

TurboGears URL 中可替换下划线的完整字符列表是什么?

另外,这个功能是否可以限制为只能替换某些字符?理想情况下,我希望带有破折号 (http://localhost:5000/all--things) 的 URL 以及带有下划线 (http://localhost:5000/all__things) 或任何其他奇怪字符的 URL不工作。

这是由 path_translator 管理的,可以通过 app_cfg.py 中的 dispatch_path_translator 选项进行配置。可以通过传递 None 或提供自定义函数来禁用它。

提供的任何函数都将接收当前正在处理的路径部分,并且必须return对其进行规范化。

默认路径转换器基于 string.punctuation(参见 https://github.com/python/cpython/blob/c30098c8c6014f3340a369a31df9c74bdbacc269/Lib/string.py#L31

如果您有自定义路由需求,我建议您考虑 https://github.com/TurboGears/tgext.routes,这可能会通过 @route 装饰器在更复杂的情况下帮助您。