IndexError: индекс кортежа вне диапазона postgresql
Я использовал функцию дайджеста модуля расширения pgcrypto для кодирования нескольких значений. Недавно я обнаружил, что некоторые значения URL, которые я пытаюсь кодировать, содержат '%,'
которые бросают
IndexError: индекс кортежа вне диапазона.
Я потратил часы сегодня, пытаясь решить эту проблему, но до сих пор я не исправил эту ошибку в своем коде. Как мне кодировать URL
что содержит специальные символы?
Это работает в pgAdmin4
, но не в моем скрипте Python:
encode(digest('domainname.com/pub-cgi/retrieve.pl?doc=file%2F1999&zone_19=300%2A%20','sha256')
Как мне закодировать URL, который содержит специальные символы?
1 ответ
Проведя дополнительные исследования Stack Overflow, я нашел решение, которое было опубликовано несколько лет назад.
Декодировать экранированные символы в URL
Это код, который я использовал для решения моей проблемы кодирования:
# This section of code reformats a href with URL encoding
def unquote(url):
return re.compile('%([0-9a-fA-F]{2})',re.M).sub(lambda m: chr(int(m.group(1),16)), url)
# URL with encoding - https://www.somedomainname.com/pubs/retrieve.pl?doc=some%2Ddocument%2Dname.pdf
print (unquote('https://www.somedomainname.com/pubs/retrieve.pl?doc=some%2Ddocument%2Dname.pdf'))
# Output - https://www.somedomainname.com/pubs/retrieve.pl?doc=some-document-name.pdf
Теперь, когда я переформатировал этот URL, я могу использовать функцию дайджеста модуля расширения pgcrypto для кодирования с помощью хэша SHA-256.
encode(digest('https://www.somedomainname.com/pubs/retrieve.pl?doc=some-document-name.pdf','sha256')
СПЕЦИАЛЬНОЕ ПРИМЕЧАНИЕ: Я удаляю протокол href из URL-адресов перед их хэшированием, поскольку он предотвращает дублирование, что является моей проблемой.