Python Pyramid视图中的异常管理

时间:2012-07-03 06:54:00

标签: jquery python forms exception-handling pyramid

我正在编写Python Pyramid项目,我使用jQuery和jquery.form.js。我希望我的观点能够处理HTTP和AJAX帖子(我不确定它是否是最好的主意,但这可能是另一个问题的内容)。

现在,当发送HTTP POST并发生错误时,我使用self.request.session.flash()进行错误通知。 但是当发布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);
    }
});

但正如Loïc Faure-Lacroix建议我可以为Ajax和HTTP请求发送dict,这样可以简化代码。

什么是更好的主意?抛出异常时我应该从视图中返回什么?

1 个答案:

答案 0 :(得分:5)

这个想法是返回一个包含你想要在json响应中的值的dict。此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返回的内容的一部分时,这才有效。