2010-02-12 22 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