如何让 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 作者改变主意,否则我看不到更好的选择。
我有一个简单的 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 作者改变主意,否则我看不到更好的选择。