Django的URL中不能有引号字符?
我在关注这个讨论,并使用了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 个回答
有几个关于这个问题的Django问题单,相关链接在这里:https://code.djangoproject.com/ticket/16541 和 https://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的解码。