我正在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,那么我可以取消引用它?我的目标是获得一个字符串文字,然后我可以编码为十六进制字符串。
有什么想法?如果有一些我缺少的编码概念,请道歉。谢谢!
答案 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']
。