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-адресов перед их хэшированием, поскольку он предотвращает дублирование, что является моей проблемой.

Другие вопросы по тегам