2012-07-02 14 views
5

Ho alcuni moduli HTML nella mia applicazione Python Pyramid. Mi piacerebbe che funzionassero tramite AJAX quando JavaScript è abilitato e quando JavaScript è disabilitato. Ora utilizzo visualizzazioni diverse per AJAX e per i normali moduli, ma il codice sembra quasi lo stesso per queste funzioni, ad eccezione della risposta. Io uso visualizzazione di classe come questo (corpo della classe):Come unificare le viste Python Pyramid per gestire i moduli POST Ajax/html

def ajax_ok(self, msg): 
    return Response(body=msg) 

def ajax_error(self, msg): 
    return HTTPInternalServerError(body=msg) 

@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: 
      return self.ajax_error('some error') 
     else: 
      return self.ajax_ok('ok') 

@action() 
def ftp(self): 
    if 'form.submitted' in self.params: 
     try: 
      self.config.save(self.params) 
     except: 
      self.request.session.flash('error; ' + msg) 
     else: 
      self.request.session.flash('success; ' + msg) 
    return {'content': render('templates/ftp.pt', {'ftp': 
                self.config.ftp})} 

ho bisogno di gestire errore se qualsiasi e mostrarle in html. Forse dovrei usare finished_callback o il mio riproduttore che invierà una risposta diversa per un tipo di richiesta diverso ??

+0

sembra che solo 1 dei 4 percorsi di codice sia lo stesso ora, quindi non sono sicuro di cosa sperare di consolidare. Direi che è abbastanza buono per gestire tutte le funzionalità 'save' in un posto comune e gestire gli errori in modo indipendente. –

risposta

4

Si potrebbe fare qualcosa di simile:

@action(name='ftp', renderer='templates/ftp.pt') 
@action(xhr=True, renderer='json', name='ftp') 
def ftp_ajax(self): 
    log.debug('View: %s', 'ftp (ajax)') 

    # CODE 

    if request.is_xhr: 
     return JSON 
    else: 
     return something for template 

Ma se si fa veramente grande si potrebbe avere qualcosa di simile:

@action(name='ftp', renderer='templates/ftp.pt') 
@action(xhr=True, renderer='json', name='ftp') 
def ftp_ajax(self): 
    log.debug('View: %s', 'ftp (ajax)') 
    my_values = dict() 

    # Code 

    return my_values 

ma ad essere onesti nel codice attuale, il codice ISN 'molto simile visto che in te non ritorni la stessa cosa e in un caso, spingi a lampeggiare qualche informazione e nel secondo tu restituisci alcune cose.

In tal caso, è meglio tenere le cose separate piuttosto che unire tutto. Ma se è possibile separare e restituire gli stessi dati, è possibile impilare insieme @action.

+0

Mi piace la tua soluzione ma ora vedo che ho avuto 2 problemi e il secondo è come gestire le eccezioni nelle viste (nella stessa situazione - quando pubblichi i moduli html e AJAX). – marcinpz

+0

Invece di generare eccezioni o restituire eccezioni, puoi usare qualcosa del genere. 'dict (ok = False, message =" messaggio di errore ")' quando hai un errore e 'dict (ok = True, content = dict (...))' –

+0

nota che il renderer json renderà correttamente un oggetto che tu può ispezionare e il modello può usare anche quei valori. Sono abbastanza sicuro che è possibile aggiungere un evento beforerender che verificherà ok e is.xhr e genererà un'eccezione se necessario con il messaggio contenuto. Potrebbe non essere il migliore, ma è possibile farlo lì –

0

Si potrebbe semplicemente avere un metodo ftp e al suo interno verificare se request.is_xhr è true per rendere l'errore/risposta corretto.

Problemi correlati