Django的URL中不能有引号字符?

1 投票
1 回答
501 浏览
提问于 2025-04-17 09:17

我在关注这个讨论,并使用了peppergrower提供的代码。但是,当我把加密和编码后的字符添加到网址中并尝试访问这个网址时,Django出现了以下错误:

追踪记录(最近的调用在最前面):

文件 "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行,在 call

return self.application(environ, start_response)

文件 "C:\Python27\lib\site-packages\django\core\handlers\wsgi.py",第264行,在 call

logger.warning('错误请求(Unicode解码错误):%s' % request.path,

UnboundLocalError: 本地变量'request'在赋值前被引用

这样的一个网址示例是 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/。我注意到,只要网址中出现%符号,Django就会抛出上述异常。这让我感到困惑,因为这些编码后的字符已经没有Unicode了。

我使用的是Django 1.3.1

1 个回答

0

有几个关于这个问题的Django问题单,相关链接在这里:https://code.djangoproject.com/ticket/16541https://code.djangoproject.com/ticket/5738。特别是Malcolm在#5738的评论,下面是部分内容:

问题在于,虽然强烈推荐使用UTF-8作为非ASCII数据的编码,但直到最近,这个编码方式并没有在任何规范中明确规定(例如,RFC 2396对此没有明确说明)。只有在RFC 3986中,才清楚地规定了IRI到URI的编码。

在这段时间里,一些系统被部署出来,输出的URI并不是UTF-8编码。

所以我将提交一个更改,对于格式不正确的输入(非UTF-8),返回400错误响应。同时,这个更改也会让用户更容易重写请求类,这样如果有人在处理旧系统时,可以通过子类化WSGIRequestor或ModPythonRequest来根据需要处理URI的解码。

撰写回答