Найти - Пользователи
Полная версия: UnicodeDecodeError при обработке POST запроса
Начало » Pyramid / Pylons / TurboGears » UnicodeDecodeError при обработке POST запроса
1
Solaris
Пытаюсь прикрутить платежную систему к сайту. Платежная система отправляет информацию о платежах на конкретный 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)
slav0nic
def request_factory(environ):
    req = pyramid.request.Request(environ)
    return req.decode(charset='cp1251')
config.set_request_factory(request_factory)
а если так?
вообще да, падать ничего не должно, попробуй в ирц на FreeNode #pyramid спросить, там яйцеголовые разрабы сидят
Solaris
Да, так работает, но перестают корректно работать Unicode запросы, что неудивительно.

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

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

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