Управление исключениями в представлениях Python Pyramid

Я пишу проект Python Pyramid и использую jQuery и jquery.form.js. Я хочу, чтобы мои представления обрабатывали сообщения как HTTP, так и AJAX (я не уверен, что это лучшая идея, но, вероятно, это материал для другого вопроса здесь).

Теперь я использую self.request.session.flash() для уведомления об ошибке, когда HTTP POST был отправлен и произошла ошибка. Но когда Ajax публикуется, я возвращаю ответ HTTPOk() или HTTPServerError(), поэтому я могу легко показать пользователю сообщение об ошибке:

$('.ajax_form').ajaxForm({
    error: function(xhr, textStatus, err){
        $('.ajax_messages>.alert').hide().siblings('.alert-error').show().children('p').text(xhr.responseText);
    },
    success: function(responseText, statusText, xhr){
        $('.ajax_messages>.alert').hide().siblings('.alert-success').show().children('p').text(xhr.responseText);
    }
});

Но, как предложил Лоик Фор-Лакруа, я могу отправлять dict как для Ajax, так и для HTTP-запросов и таким образом упростить код.

Что лучше идея? Что я должен вернуть из представления, когда было выбрано исключение?


person marcinpz    schedule 03.07.2012    source источник


Ответы (1)


Идея состоит в том, чтобы вернуть словарь, содержащий нужные значения в ответе json. Этот dict может отображаться через json или через ваш шаблон. В случае ошибки вы можете установить статус ответа на 500. Это работает, если все, что вы делаете, идентично (одинаковые данные, необходимые для json и для html, одинаковые коды ответов). В противном случае ваша жизнь будет трудной, и лучше всего просто разделить ее.

@action(name='ftp', renderer='templates/ftp.pt')
@action(xhr=True, renderer='json', name='ftp')
def ftp_ajax(self):
    log.debug('View: %s', 'ftp (ajax)')

    if 'form.submitted' in self.params:
        try:
            self.config.save(self.params)
        except:
            request.response.status = 500
            return {'status': 'error', 'error_msg': 'some error'}
        else:
            return {'status': 'success'}

    request.response.status = 400
    return {'status': 'error', 'error_msg': 'invalid request'}

Все, что вам нужно сделать, это убедиться, что ваш шаблон может обрабатывать поля «status» и «error_msg», и все готово. Опять же, это хорошо работает только в том случае, если требования шаблона являются подмножеством того, что вы возвращаете для json.

person Michael Merickel    schedule 03.07.2012