Python Pyramid视图中的异常管理

mar*_*npz 3 python forms jquery exception-handling 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);
    }
});
Run Code Online (Sandbox Code Playgroud)

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

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

Mic*_*kel 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'}
Run Code Online (Sandbox Code Playgroud)

您所要做的就是确保您的模板可以处理'status'和'error_msg'字段并且您很高兴.同样,只有在模板的要求是您为json返回的内容的子集时,这才有效.