Форум сайта python.su
python2.7, xubuntu
Сталкнулся с тривиальной, на первый взгляд, проблемой, но уже 5 часов не могу ее решить…Облазил кучу форумов. очень много где встречается данная проблема, но решения нигде не нашел.
Итак код следующий:
# -*- coding: utf-8 -*- # -*- coding: 'utf-8' -*- from __future__ import unicode_literals from xml.dom.minidom import Document import urllib2 import StringIO import gzip def do_request(request): data = request data = unicode(data, "utf-8") connection = urllib2.build_opener() connection.addheaders = [('WebKey', '123'), ('Content-Length', len(request)), ('Accept-Charset', 'utf-8')] #response = unicode(connection.open("http://не_скажу/?OperationType=0", data) , "utf-8") response = connection.open("http://не_скажу/?OperationType=1", data).decode('utf-8') #return response.data() #return response.info() return str(response) if response.info().get('Content-Encoding') == 'gzip': buf = StringIO.StringIO( response.read()) gzip_f = gzip.GzipFile(fileobj=buf) content = gzip_f.read() else: content = response.read() return content
Офлайн
Чудак человек, передаёт `unicode` в качестве данных вот уже 5 часов, замучил бедный интерпретатор, никак не хочет читать его "can't encode" (поясняю, это операция unicode->str). Ну блин, А и Б сложить.
И что это за open(…).decode(…)? Ещё пять часов будем искать причину новой ошибки? API не читай @ код пиши :-).
p.s. Марш читать документацию по `urllib2`, особое вниманием уделяем типам передаваемых аргументов и получаемых результатов и ничего не придумываем сами, в частности, относительного того, что должен возвращать `urllib2.OpenerDirector.open`.
..bw
Отредактировано bw (Ноя. 26, 2013 19:01:54)
Офлайн
volframka
Ошибка стандартная: ‘ascii’ codec can't encode characters in position 98-106: ordinal not in range(128)
volframka
connection.open("http://не_скажу/?OperationType=1", data).decode('utf-8')
Отредактировано Budulianin (Ноя. 26, 2013 19:47:14)
Офлайн
Спасибо, что ответили. Только прошу, в дальнейшем, не общаться со мной, как с неким школьником…
BudulianinИзвини, но разумно ли, отключать демонизацию, убирать исключения далеко не в одном месте в огромной системе, если и так понятно, что ошибка в кодировке?
Нужно ПОЛНЫЙ stack trace ошибки писать, а не последнюю строку.
Budulianinне пропускал, просто уже опустил.
read() пропустил
#!/usr/bin/python # -*- coding: utf-8 -*- import urllib2 from xml.dom.minidom import Document def do_request(request): data = request connection = urllib2.build_opener() connection.addheaders = [(('WebKey', ''), ('Content-Length', len(request)) )] return connection.open("https://1234:15924", data).read() def send_order(): ... xm = doc.toxml(encoding='utf-8') sxml = do_request(xm) return sxml
return connection.open("https://1234:15924", data).read()
response = connection.open("https://1234:15924", data) return response.read()
connection.open("https://1234:15924", data)
Отредактировано volframka (Ноя. 27, 2013 09:42:53)
Офлайн
А что у Вас в данном случае есть request?
data should be a buffer in the standard application/x-www-form-urlencoded format
Офлайн
FishHook Спасибо за ответ, действительно, этот момент я упустил
FishHookЧестно говоря, не совсем понимаю в какую кодировку переводить. Написано, что application/x-www-form-urlencoded - ascii. мне она не подходит. А в заголовок добавил:
А что у Вас в данном случае есть request?
# -*- coding: utf-8 -*- from __future__ import unicode_literals from xml.dom.minidom import Document import urllib2 def do_request(request): data = request connection = urllib2.build_opener() connection.addheaders = [('Content-Length', len(request)), ('Content-type', 'application/x-www-form-urlencoded'), ('Accept-Charset', 'utf-8')] response = connection.open("http://1230:5541/?OperationType=1", data) return response.read()
Отредактировано volframka (Ноя. 27, 2013 10:22:04)
Офлайн
Тут вопрос вообще в другом, например, в Джанге request - обязательный параметр каждого представления, это объект класса HttpRequest, часть фреймворка. Разумеется, если я попытаюсь передать этот request в connection.open случится какая-нибудь ошибка, просто потому, что этот реквест никаким образом не application/x-www-form-urlencoded. Точно так же слажает request из wergzeug или webob.
какой вообще тип у этого параметра?
Офлайн
FishHook
какой вообще тип у этого параметра?
xm = doc.toxml(encoding='utf-8') sxml = do_request(xm)
Отредактировано volframka (Ноя. 27, 2013 10:58:11)
Офлайн
Что-то в миндоме..
Если создаю xml с помощью “etree”, то все нормально работает!
Офлайн
А если `assert type(data) is str` скажет об обратном, что будем делать?
Почему я буду говорить с вами как со школьником? Потому что только школьник может писать `data = unicode(data, ‘utf-8’)` и делать непонятное лицо, мол почему ошибка, у меня везде `str` как “я читал”.
> если и так понятно, что ошибка в кодировке?
Поясняю. Многие берут за правило, показывать один код, а тестировать другой. А traceback помогает выявить таких добрых, но неблагодарных людей. Может у вас там вообще ошибка при разборе заголовков, которые формируются вовсе не тем образом, что вы тут нам показываете.
И что это за…
Отредактировано bw (Ноя. 27, 2013 17:17:09)
Офлайн