Django没有正确翻译Bittorrent查询字符串

时间:2010-02-12 05:56:58

标签: python django encoding bittorrent

我正在Django框架之上编写一个小型Bittorrent跟踪器,作为更大项目的一部分。但是,我在解码通告请求的“info_hash”参数时遇到了问题。

基本上,uTorrent采用相关torrent的SHA1哈希值,URL对其的十六进制表示进行编码,然后将其作为info_hash参数发送到GET请求中的跟踪器。

info_hash

A44B44B0EE8D85A9F7135489D522A19DA2C87C91

编码为:

%a4KD%b0%ee%8d%85%a9%f7%13T%89%d5%22%a1%9d%a2%c8%7c%91

但是,Django将其解码为Unicode字符串:

u'\ufffdKD\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\x13T\ufffd\ufffd"\ufffd\ufffd\ufffd\ufffd|\ufffd'

而不是像这样的字符串文字:

\xa4KD\xb0\xee\x8d\x85\xa9\xf7\x13T\x89\xd5"\xa1\x9d\xa2\xc8|\x91

如何阻止Django尝试将info_hash转换为Unicode,那么我可以取消引用它?我的目标是获得一个字符串文字,然后我可以编码为十六进制字符串。

有什么想法?如果有一些我缺少的编码概念,请道歉。谢谢!

2 个答案:

答案 0 :(得分:1)

你的设置是什么.DEFAULT_ENCODING?哈希在HTTP头中的样子如何解释?在编码过程中根本不应该修改它,如下所示:

>>> import urllib
>>> urllib.urlencode({'hash':"A44B44B0EE8D85A9F7135489D522A19DA2C87C91"})
'hash=A44B44B0EE8D85A9F7135489D522A19DA2C87C91'

自:

>>> urllib.quote('A44B44B0EE8D85A9F7135489D522A19DA2C87C91') == 'A44B44B0EE8D85A9F7135489D522A19DA2C87C91'
True

因此:

>>> urllib.unquote('%a4KD%b0%ee%8d%85%a9%f7%13T%89%d5%22%a1%9d%a2%c8%7c%91') == 'A44B44B0EE8D85A9F7135489D522A19DA2C87C91'
False

答案 1 :(得分:0)

Django使用默认编码解码所有GET数据。您需要自己获取查询字符串,可能来自os.environ['QUERY_STRING']request.environ['QUERY_STRING']