Форум сайта python.su
0
Всем привет. Есть простейший скрипт wsgi, в одной части форма из двух инпутов и кнопки, которая передаёт данные GETом. Вторая часть эти данные берет, парсит url и присваивает двум переменным значения полученные из GET.
Проблема вроде бы типичная - не обрабатываются строки с кириллицей, например не работает .upper() Но ни обычные методы (в cli-скрипте помог .decode('utf-8') точно в такой же ситуации), ни тупой перебор всех возможных decode, encode и прочее - не помогает (а если быть точнее вываливается с ошибками UnicodeDecodeError или TypeError).
Возможно нужны какие-то подробности по окружению? Хост на ред хате, пайтон 2.7, локаль utf-8.
Офлайн
61
Возможно кусочек кода и пример строки помог бы быстрее дать вам ответ.
http://python.su/forum/topic/724/
Офлайн
0
Первая часть, которая просто выводит форму
elif environ['PATH_INFO'] == '/' or environ['PATH_INFO'] == '/main': ctype = 'text/html' response_body = '''<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>Welcome to OpenShift</title> </head> <body> <form action="/justdoit" method="get"> <input type="text" name="name"> <input type="text" name="code"> <input type="submit" value="Send"> </form> </body> </html>'''
elif environ['PATH_INFO'] == '/justdoit': ctype = 'text/html' params = urlparse.parse_qs(environ.get('QUERY_STRING','utf-8')) name = str(params.get('name', [''])[0]) code = str(params.get('code', [''])[0]) print params print name print repr(name) print type(name)
print params {'code': ['123'], 'name': ['\\xd0\\xa2\\xd0\\xb5\\xd1\\x81\\xd1\\x82']}
print name \xd0\xa2\xd0\xb5\xd1\x81\xd1\x82
print repr(name) '\\xd0\\xa2\\xd0\\xb5\\xd1\\x81\\xd1\\x82'
print type(name) <type 'str'>Отредактировано monthy (Ноя. 10, 2015 18:31:43)
Офлайн
24
>>> print "\xd0\xa2\xd0\xb5\xd1\x81\xd1\x82".decode('utf-8') Тест
Отредактировано ayb (Ноя. 11, 2015 09:05:15)
Офлайн
0
А вообще возьмите что-то легкое ( например боттл )Это не вариант. У меня интерес не практический, а академический. Если в боттле, фласке или где-то еще это смогли реализовать, значит и я смогу. Инструмент не должен быть черным ящиком.
Офлайн
24
Инструмент не должен быть черным ящиком
Отредактировано ayb (Ноя. 11, 2015 15:31:29)
Офлайн
0
Это, кстати, неплохой вариант, спасибо.
Частично нащупал решение:
Надо query string еще до парсинга обратить в юникод:
unicode(environ.get('QUERY_STRING'), 'utf-8')
Отредактировано monthy (Ноя. 11, 2015 23:18:52)
Офлайн
0
Ок. У меня получилось, но я совсем ничего не понимаю.
Клюевым оказалось вот какое решение:
Сначала в юникод:
unicode(environ.get('QUERY_STRING'), 'utf-8')
name = name.encode('latin-1').decode('utf-8')
name.encode('utf-8')
Офлайн