Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 23, 2015 09:17:30

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2627
Репутация: +  61  -
Профиль   Отправить e-mail  

urlparse: Invalid IPv6 URL

Столкнулся с такой проблемой
Нужно распарсить урл содержащий символы

[ ]
Например

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

Как обойти?



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Отредактировано ZerG (Окт. 23, 2015 09:18:37)

Офлайн

#2 Окт. 23, 2015 11:15:16

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

urlparse: Invalid IPv6 URL

ZerG
писать свое регулярное выражение



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Окт. 23, 2015 11:21:23

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9844
Репутация: +  853  -
Профиль   Отправить e-mail  

urlparse: Invalid IPv6 URL

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='')
>>>



Отредактировано py.user.next (Окт. 23, 2015 11:25:51)

Офлайн

#4 Окт. 23, 2015 11:53:10

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2627
Репутация: +  61  -
Профиль   Отправить e-mail  

urlparse: Invalid IPv6 URL

Так и смысл? Оно то его парсит - но как пароль не принимает

# -*- 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 то есть аутентификация не пройдет.



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Отредактировано ZerG (Окт. 23, 2015 11:56:43)

Офлайн

#5 Окт. 23, 2015 12:13:37

sander
Зарегистрирован: 2015-02-19
Сообщения: 317
Репутация: +  53  -
Профиль   Отправить e-mail  

urlparse: Invalid IPv6 URL

ZerG
создай свой connection

Офлайн

#6 Окт. 23, 2015 12:53:35

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2627
Репутация: +  61  -
Профиль   Отправить e-mail  

urlparse: Invalid IPv6 URL

Да учитывая что pgwrap всего лишь обвес на psycopg2 без проблем. Однако не есть гуд дописывать стандартные либы.



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

#7 Окт. 23, 2015 13:02:08

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9844
Репутация: +  853  -
Профиль   Отправить e-mail  

urlparse: Invalid IPv6 URL

ZerG
соответственно пароль который оно передает при коннекте к БД будет
Если она использует URI (формат адреса), то она не может передавать октеты, закодированные через процент, не раскодировав их, иначе она нарушает rfc, который и определяет формат адреса.
Можешь написать разработчикам pgwrap.



Отредактировано py.user.next (Окт. 23, 2015 13:03:13)

Офлайн

#8 Окт. 23, 2015 13:38:45

sander
Зарегистрирован: 2015-02-19
Сообщения: 317
Репутация: +  53  -
Профиль   Отправить e-mail  

urlparse: Invalid IPv6 URL

ZerG
это не стандартная либа

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version