3

我正在编写 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);
    }
});

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

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

4

1 回答 1

5

这个想法是返回一个包含您想要在 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 返回的内容的子集时才有效。

于 2012-07-03T17:47:47.647 回答