2012-07-03 42 views
3

我正在編寫Python Pyramid項目,並使用jQuery和jquery.form.js。我希望我的視圖能夠處理HTTP和AJAX帖子(我不確定這是否是最好的主意,但這可能是另一個問題的原因)。Python中的異常管理金字塔視圖

現在我使用self.request.session.flash()進行HTTP POST發送併發生錯誤時的錯誤通知。 但是,當阿賈克斯貼,我回到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請求發送字典這樣簡化了代碼。

有什麼更好的主意?拋出異常時,我應該從視圖返回什麼?

回答

5

這個想法是返回一個包含你想要在json響應中的值的字典。這個字典可能通過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'} 

所有你需要做的是確保你的模板可以處理「狀態」和「ERROR_MSG」字段,你是好去。再說一遍,如果模板的需求是你爲json返回的東西的一個子集,這隻會很好。