【问题标题】:How can I receive percent encoded slashes with Django on App Engine?如何在 App Engine 上使用 Django 接收百分比编码的斜线?
【发布时间】:2011-03-03 17:02:49
【问题描述】:

我将 Django 与 Google 的 App Engine 结合使用。

我想用百分比编码的斜线向服务器发送信息。像 http:/localhost/turtle/waxy%2Fsmooth 这样的请求将匹配像 r'^/turtle/(?P<type>([A-Za-z]|%2F)+)$' 这样的 URL。请求原封不动地到达服务器,但在与正则表达式进行比较之前,%2F 被转换为正斜杠。

如何阻止 %2Fs 转换为正斜杠?谢谢!

【问题讨论】:

  • 为什么不能只更改正则表达式以使用非编码版本?
  • 我们使用的是 RESTful 设计,还有其他看起来像 r'^/turtle/(?P<type>([A-Za-z]|%2F)+)/shell$' 的正则表达式。我们想要区分属于 URL 层次结构的斜线和属于海龟名称的斜线。
  • 我会将其添加到我在评估候选 Python Web 框架时使用的需求列表中。
  • 你说它是“有时”转换的——在什么情况下?
  • 它说“有时”。我的意思是,在它到达服务器之后但在与正则表达式进行比较之前,%2F 会转换为正斜杠。

标签: python django google-app-engine


【解决方案1】:

os.environ['PATH_INFO'] 已解码,因此您会丢失该信息。可能os.environ['REQUEST_URI'] 可用,如果可用,则未解码。 Django 只读取 PATH_INFO。您可能可以这样做:

request_uri = environ['REQUEST_URI']
request_uri = re.sub(r'%2f', '****', request_uri, re.I)
environ['PATH_INFO'] = urllib.unquote(request_uri)

然后所有 %2f 的大小写都替换为 ****(或任何你想使用的)。

【讨论】:

  • 什么设置 REQUEST_URI?我在 pep 333 所需的 wsgi 变量列表中没有看到它。
  • PEP 333 中不需要它,但它被广泛设置为 CGI(或类似 CGI)请求的一部分。在 GAE 上,如果它存在,那么它肯定会保持存在。它是完整的请求路径,没有对其进行 URL 解编码。
  • os.environ['REQUEST_URI'] 在 GAE 上不可用。
  • 另一种适用于 GData 的技术是你有类似 /{http:%2f%2ffoo}attr/ 的东西(当它到达 WSGI 时看起来像 /{http://foo}attr/),但因为它使用嵌套大括号,你可以解析出块。您可以类似地设计您的网址。
  • 我认为将名称括起来的建议可能是没有破解 Django 的最佳解决方案。感谢您的帮助,伊恩!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-04
  • 1970-01-01
  • 1970-01-01
  • 2010-12-07
  • 1970-01-01
  • 2013-09-26
  • 1970-01-01
相关资源
最近更新 更多