我正在编写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,这样可以简化代码。
什么是更好的主意?抛出异常时我应该从视图中返回什么?
答案 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返回的内容的一部分时,这才有效。