2012-07-03 2 views
3

J'écris le projet Python Pyramid et j'utilise jQuery et jquery.form.js. Je veux que mon point de vue gère à la fois les messages HTTP et AJAX (je ne suis pas sûr que ce soit la meilleure idée, mais c'est probablement le sujet d'une autre question ici).Gestion des exceptions dans les vues Python Pyramid

Maintenant j'utilise self.request.session.flash() pour la notification d'erreur quand HTTP POST a été envoyé et une erreur s'est produite. Mais quand Ajax est affiché, je retourne HTTPOk() ou HTTPServerError() réponse donc je peux facilement un message d'erreur d'exposition à l'utilisateur:

$('.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); 
    } 
}); 

Mais comme Loïc Faure-Lacroix suggéré que je pourrais envoyer dict pour les deux Ajax et les requêtes HTTP et ainsi simplifier le code.

Quelle est la meilleure idée? Que devrais-je retourner de vue lorsqu'une exception a été lancée?

Répondre

5

L'idée est de renvoyer une dict contenant les valeurs souhaitées dans la réponse json. Cette dict peut être rendue via json ou via votre template. Dans une condition d'erreur, vous pouvez définir le statut de réponse à 500. Cela fonctionne si tout ce que vous faites est identique (mêmes données nécessaires pour json et pour html, mêmes codes de réponse). Sinon, votre vie sera difficile et il vaut mieux la séparer.

@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'} 

Tout ce que vous avez à faire est de vous assurer que votre modèle peut gérer le « statut » et « champs de ERROR_MSG » et vous êtes bon pour aller. Encore une fois, cela ne fonctionne que si les exigences du modèle sont un sous-ensemble de ce que vous retournez pour JSON.