【问题标题】:How to make TurboGears treat '%2F' differently from '/' when routing?路由时如何使 TurboGears 将 '%2F' 与 '/' 区别对待?
【发布时间】:2017-04-27 20:25:19
【问题描述】:

我有一个简单的 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 时,我看到了预期的“dave”。但是当我访问http://localhost:5000/lookup/dave%2Fdavid 时,我得到一个 404 错误而不是“dave/david”。似乎 TurboGears 将 'dave%2Fdavid' 拆分为两个单独的参数。

如何让 TurboGears 尊重转义的斜线与未转义的斜线不同?

【问题讨论】:

  • Web 浏览器肯定会区分 / 和 %2F。
  • 10 年前有一个 TurboGears 的错误报告,它已经“修复”(但现在又回来了):trac.turbogears.org/ticket/377
  • 经过进一步研究,您似乎是正确的。

标签: python url-routing turbogears2 turbogears


【解决方案1】:

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

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

【讨论】:

  • 实际上,在我看来,CGI RFC tools.ietf.org/html/draft-coar-cgi-v11-03(WSGI 3333 指向的)第 4.1.5 节明确指出 PATH_INFO 不是 url 编码的:"Unlike a URI path, the PATH_INFO is not URL-encoded"。跨度>
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2017-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多