【问题标题】:Django can't have quoted characters in urls?Django 不能在 url 中包含引号字符?
【发布时间】:2011-12-30 23:47:52
【问题描述】:

我正在关注this thread 并采用胡椒种植者的代码。但是当我将加密和引用的字符添加到 url 并尝试访问此 url 时,Django 失败并出现以下错误:

Traceback(最近一次调用最后一次):

文件 “C:\Python27\lib\site-packages\django\core\servers\basehttp.py”,行 283,运行中 self.result = application(self.environ, self.start_response)

文件 "C:\Python27\lib\site-packages\django\contrib\staticfiles\handlers.py", 第 68 行,在 调用 return self.application(environ, start_response)

文件 "C:\Python27\lib\site-packages\django\core\handlers\wsgi.py", 第 264 行,在 调用 logger.warning('错误请求 (UnicodeDecodeError): %s' % request.path,

UnboundLocalError:之前引用的局部变量“请求” 作业

这种类型的示例网址是http://localhost:8000/customer/unsubscribe/%F1%CDE%A2%9DL%BF%21W%60%FF%04%D2%D2%3B%B1%FB%C9%8Ff%89%06O%FFY%E2_%16%9BnPM/。我注意到只要 % 出现在 url 中,Django 就会抛出异常。这没有多大意义,因为引用的字符已经有零个 unicode。

我正在使用 Django 1.3.1

【问题讨论】:

  • 本地主机 URI 对我们没有任何好处...我们的机器上运行的服务与您不同。你能提供代码吗?
  • 这实际上看起来像是 Django 错误处理中的一个错误,不是吗?像这样的核心 Django 代码中不应该有UnboundLocalError
  • 是的,dkamins,这确实是一个错误。真正的错误是 django 无法处理 url 中的 %,因为它是引用的 unicode 的一部分。但是当引发错误时,就会发生 UnboundLocalError 。无论如何,令人沮丧的是,引用的 unicode 应该像 django doc 所说的那样正常工作,但实际上并没有。
  • @GeorgiePorgie “引用的 unicode”是什么意思?我只是将上面的 % 示例放在我的 URL 中,我没有收到任何错误。欲了解更多信息,请查看docs.djangoproject.com/en/1.3/ref/unicode/#uri-and-iri-handling
  • @GeorgiePorgie 我的立场是正确的。当我测试它时,它看起来好像没有发生错误。我收到 400 错误请求错误。我很想了解有关此问题的更多信息。

标签: python django


【解决方案1】:

有一些与此问题相关的 Django 票证https://code.djangoproject.com/ticket/16541https://code.djangoproject.com/ticket/5738。特别是在#5738 上的Malcolm's comment 部分如下:

问题在于,尽管强烈推荐使用 UTF-8 作为 非 ASCII 数据的编码,它实际上并没有在任何规范中编码 直到最近(例如,RFC 2396 让事情大开眼界)。 只有在 RFC 3986 中才明确 IRI 到 URI 编码。

在此期间,部署了输出非 UTF-8 编码的系统 URI。

所以我将提交一个 400 响应的更改 格式错误的输入(非 UTF-8),但也更容易覆盖 请求类,所以如果有人正在处理遗留系统,他们 可以继承 WSGIRequestor 或 ModPythonRequest 来处理解码 URI,但他们需要。

【讨论】:

  • 在我的例子中,unicode 被“引用”为只有 ascii 的文本,在 url 中应该是安全的。我见过很多带有这种“引用”网址的网站。 Django 捕获 url 并自动“取消引用”它(在我看来),但它无法正确处理它。
  • 如果我正确阅读了评论,则表示如果它们不是 UTF-8 则无法处理。
  • 好像是这样。如果我在 url 中直接有 unicode(不是引用的),django 似乎认为没问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-28
  • 1970-01-01
  • 2015-05-31
  • 2020-09-17
相关资源
最近更新 更多