Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 26, 2012 12:31:50

Solaris
От:
Зарегистрирован: 2011-06-02
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

UnicodeDecodeError при обработке POST запроса

Пытаюсь прикрутить платежную систему к сайту. Платежная система отправляет информацию о платежах на конкретный URL моего приложения. Эти запросы вызывают UnicodeDecodeError, по причине того, что параметры POST-запроса содержат не ASCII-символы, а сам запрос закодирован не в Unicode (в моем случае это кириллица закодированная в cp1251).

Воссоздать данную ошибку можно с помощью файла в кодировке cp1251, достаточно открыть его в браузере и нажать кнопку формы. Вместо localhost может быть даже pylonsproject.org, что доказывает, что проблема не только в моем сайте.

<form action="http://localhost:6543/" method="post">
    <input type="submit" name="button" value="Привет!">
</form>

Может я что-то не понимаю, но по-моему нормальное приложение не должно выдавать Internal Server Error из-за неправильного запроса. Ошибка на сервере означает проблему в коде, которую нужно исправить.

Возможно кто-то уже сталкивался с подобной проблемой и знает ответы на вопросы:
1. Можно ли как-нибудь обработать такой запрос внутри Pyramid приложения?
2. Как защитить свое приложение от потенциального Traceback-флуда в логах? А у многих Traceback еще и на мыло отправляется.
3. Это все таки проблема Pyramid или WebOb? Не знаю куда постить Issue.

UnicodeDecodeError
UnicodeDecodeError: 'utf8' codec can't decode byte 0xcf in position 0: invalid continuation byte
Traceback (most recent call last)
    File "env\lib\site-packages\pyramid_debugtoolbar-1.0.2-py2.7.egg\pyramid_debugtoolbar\panels\performance.py", line 69, in noresource_timer_handler
    result = handler(request)
    File "env\lib\site-packages\pyramid\tweens.py", line 20, in excview_tween
    response = handler(request)
    File "env\lib\site-packages\pyramid_exclog\__init__.py", line 44, in exclog_tween
    return handler(request)
    File "env\lib\site-packages\pyramid_tm-0.4-py2.7.egg\pyramid_tm\__init__.py", line 95, in tm_tween
    response = handler(request)
    File "env\lib\site-packages\pyramid\router.py", line 78, in handle_request
    has_listeners and notify(NewRequest(request))
    File "env\lib\site-packages\pyramid\registry.py", line 74, in notify
    [ _ for _ in self.subscribers(events, None) ]
    File "env\lib\site-packages\zope\interface\registry.py", line 323, in subscribers
    return self.adapters.subscribers(objects, provided)
    File "env\lib\site-packages\zope\interface\adapter.py", line 601, in subscribers
    subscription(*objects)
    File "my_project\subscribers.py", line 32, in add_localizer
    localizer = get_localizer(request)
    File "env\lib\site-packages\pyramid\i18n.py", line 209, in get_localizer
    current_locale_name = get_locale_name(request)
    File "env\lib\site-packages\pyramid\i18n.py", line 150, in get_locale_name
    locale_name = negotiate_locale_name(request)
    File "env\lib\site-packages\pyramid\i18n.py", line 137, in negotiate_locale_name
    locale_name = negotiator(request)
    File "env\lib\site-packages\pyramid\i18n.py", line 123, in default_locale_negotiator
    locale_name = request.params.get(name)
    File "env\lib\site-packages\webob\request.py", line 832, in params
    params = NestedMultiDict(self.GET, self.POST)
    File "env\lib\site-packages\webob\request.py", line 783, in POST
    vars = MultiDict.from_fieldstorage(fs)
    File "env\lib\site-packages\webob\multidict.py", line 78, in from_fieldstorage
    obj.add(field.name, decode(field.value))
    File "env\lib\site-packages\webob\multidict.py", line 72, in <lambda>
    decode = lambda b: b.decode(charset)
    File "env\Lib\encodings\utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)



Офлайн

#2 Сен. 26, 2012 17:05:54

slav0nic
Команда
От: dp.ua
Зарегистрирован: 2006-05-07
Сообщения: 2260
Репутация: +  41  -
Профиль   Отправить e-mail  

UnicodeDecodeError при обработке POST запроса

def request_factory(environ):
    req = pyramid.request.Request(environ)
    return req.decode(charset='cp1251')
config.set_request_factory(request_factory)
а если так?
вообще да, падать ничего не должно, попробуй в ирц на FreeNode #pyramid спросить, там яйцеголовые разрабы сидят

Офлайн

#3 Сен. 28, 2012 13:46:00

Solaris
От:
Зарегистрирован: 2011-06-02
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

UnicodeDecodeError при обработке POST запроса

Да, так работает, но перестают корректно работать Unicode запросы, что неудивительно.

На #pyramid ничего не посоветовали, возможно мне не хватило красноречия )

Буду писать в прокуратуру pylons-discuss

Кстати наткнулся на диалог в #pyramid
http://irclogs.rulim.de/%23pyramid/%23pyramid.2012-09-27.log.html
с 06:53 по 07:03
Речь тоже идет про то, должен ли сервер давать ошибку 500 в случае некорректного запроса. Странно но единого мнения на этот счет не сложилось.



Отредактировано Solaris (Сен. 28, 2012 13:46:24)

Офлайн

#4 Сен. 28, 2012 14:05:45

appetito
От:
Зарегистрирован: 2010-09-28
Сообщения: 147
Репутация: +  2  -
Профиль   Отправить e-mail  

UnicodeDecodeError при обработке POST запроса

была, похожая фигня, Крис сказал что это не баг((



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version