Найти - Пользователи
Полная версия: urlparse: Invalid IPv6 URL
Начало » Web » urlparse: Invalid IPv6 URL
1
ZerG
Столкнулся с такой проблемой
Нужно распарсить урл содержащий символы
[ ]
Например

result = urlparse.urlparse("postgresql://zerg:pass[word@server_name:5432/database_name")
На выхлопе получаем ошибку
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urlparse.py", line 214, in urlsplit
    raise ValueError("Invalid IPv6 URL")
ValueError: Invalid IPv6 URL

Как обойти?
JOHN_16
ZerG
писать свое регулярное выражение
py.user.next
rfc3986. ipv6 format
rfc3986. reserved
rfc3986. percent-encode

>>> import urllib.parse
>>> 
>>> hex(ord('['))
'0x5b'
>>> hex(ord(']'))
'0x5d'
>>> urllib.parse.urlparse('postgresql://zerg:pass%5Bword@server_name:5432/database_name')
ParseResult(scheme='postgresql', netloc='zerg:pass%5Bword@server_name:5432', path='/database_name', params='', query='', fragment='')
>>>
ZerG
Так и смысл? Оно то его парсит - но как пароль не принимает

# -*- coding: utf-8 -*-
import pgwrap
db = pgwrap.connection(url='postgresql://zerg:pass%5Bword@server_name:5432/database_name')
Вот оно как раз использует парсер

class connection(object):
    def __init__(self,url=None,hstore=False,log=None,logf=None,min=1,max=5,
                               default_cursor=DictCursor):
        params = urlparse.urlparse(url or 
                                   os.environ.get('DATABASE_URL') or 
                                   'postgres://localhost/')
        self.pool = ThreadedConnectionPool(min,max,
                                           database=params.path[1:],
                                           user=params.username,
                                           password=params.password,
                                           host=params.hostname,
                                           port=params.port,
                    )

соответственно пароль который оно передает при коннекте к БД будет
pass%5Bword
а не pass[word то есть аутентификация не пройдет.
sander
ZerG
создай свой connection
ZerG
Да учитывая что pgwrap всего лишь обвес на psycopg2 без проблем. Однако не есть гуд дописывать стандартные либы.
py.user.next
ZerG
соответственно пароль который оно передает при коннекте к БД будет
Если она использует URI (формат адреса), то она не может передавать октеты, закодированные через процент, не раскодировав их, иначе она нарушает rfc, который и определяет формат адреса.
Можешь написать разработчикам pgwrap.
sander
ZerG
это не стандартная либа
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB