2010-02-12 51 views
0

我正在Django框架之上写一个小型的Bittorrent跟踪器,作为大型项目的一部分。但是,我在解码通告请求的“info_hash”参数时遇到问题。Django没有正确翻译Bittorrent查询字符串

基本上,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,以便我可以取消引用它?我的目标是获得一个字符串文字,然后我可以编码为一个十六进制字符串。

有什么想法?道歉,如果有一些关于我错过的编码的概念。谢谢!

回答

0

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

+0

谢谢,我不知道是否有一个更优雅的方式来做到这一点。 – Alex 2010-02-14 21:24:25

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 
+0

好的回答,美好的时光! – jathanism 2010-02-12 07:54:44

+0

uTorrent编码的特定散列为: “%a4KD%b0%ee%8d%85%a9%f7%13T%89%d5%22%a1%9d%a2%c8%7c%91” 我不明白为什么它编码是这样的,但解码它(我发现)的唯一方法是手动通过查询字符串。 – Alex 2010-02-14 21:23:24