Django неправильно переводит строку запроса Bittorrent - PullRequest
0 голосов
/ 12 февраля 2010

Я пишу небольшой трекер Bittorrent поверх структуры Django, как часть более крупного проекта. Однако у меня возникли проблемы с декодированием параметра "info_hash" в запросе на объявление.

По сути, uTorrent принимает хеш SHA1 рассматриваемого торрента, а URL кодирует его шестнадцатеричное представление, которое затем отправляется трекеру в 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 ]

1 голос
/ 12 февраля 2010

Какие у вас настройки. 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 голосов
/ 12 февраля 2010

Django декодирует все данные GET, используя кодировку по умолчанию. Вам нужно будет получить строку запроса самостоятельно, возможно из os.environ['QUERY_STRING'] или request.environ['QUERY_STRING'].

...