2012-03-16 9 views
9

OK, sto lavorando con un backend RESTful sul mio progetto e invio di dati tramite jquery.Pubblicazione di JSON e Python Flask - qualsiasi tecnica per utilizzare il debugger di Werkzeug?

Devo dire che il debugger werkzeug è eccellente per il debug specialmente quando sei un terribile programmatore Python come me. Esegui un'eccezione di proposito dove vuoi indagare, e ispeziona il codice e le variabili usando l'html reso al debugger.

Tuttavia, quando si invia una richiesta di post anziché un get, se si lancia un'eccezione sul codice di back-end, ovviamente, il browser non renderà il testo di risposta.

C'è qualche tecnica che posso usare per rendere il testo della risposta, considerando che ha javascript e tutto il resto?

sto cercando cose diverse come ad esempio cercando di iniettare il testo di risposta in una finestra pop-up, come:

  $.postJSON = function(url, data, callback, error_callback) { 
       return jQuery.ajax({ 
        'type': 'POST', 
        'url': url, 
        'contentType': 'application/json', 
        'data': JSON.stringify(data), 
        'dataType': 'json', 
        'success': callback, 
        'error': error_callback 
       }); 
      }; 

      $.postJSON('/the_uri', {'foo': 'bar'}, 
      function(response) { 
       var a = 0; 
      }, 
      function(response) { 
       var html = response.responseText; 
       var my_window = window.open('', 'mywindow1', 'width=350,height=150'); 
       $(my_window.document).find('html').html(html); 
      }); 
     }); 

Ma questo non si prenderà cura del javascript molto bene.

Qualcuno ha qualche suggerimento?

+0

qualche possibilità di avere una soluzione ancora? Vorrei davvero poterlo fare. – David

+0

Nessuna soluzione ancora, scusa ...Non ne sto cercando più uno, quello che potresti voler fare è collegare un debugger all'applicazione del tuo pallone sul server e scorrere/tracciare il tuo codice lì. –

risposta

3

Il tuo approccio era quasi corretto. Sto usando il seguente codice per aprire il testo di risposta in una nuova finestra (non specifiche per Werkzeug o Flask affatto):

var w = window.open('', 'debug_stuff', 'width=540,height=150'); 
w.document.open(); 
w.document.write(response.responseText); 
w.document.close(); 

L'ultima riga è la più importante. Senza di esso, il codice si comporterebbe come il tuo - non eseguirà alcun JavaScript, perché il browser non sa che il DOM è stato completamente caricato.

+1

Per coloro che utilizzano jQuery: https://gist.github.com/joostdevries/6060936 – joostdevries

1

Non javascript, ma avete provato a utilizzare Firebug, è possibile utilizzare l'opzione per visualizzare la risposta in una nuova scheda (Apri risposta in una nuova scheda).

+0

sì, rende html, ma javascript non funzionerà ... –

0

Se si è pronti ad apportare alcune modifiche sia sul codice client che sul codice server, è possibile provare questo. Nella tua callback di errore, si invierebbe nuovamente i dati JSON ma come invio di un modulo sincrono. Dovresti creare il modulo usando jQuery, assegnargli un tag input e inserire il tuo JSON in quello e inviare il modulo. Qualcosa di simile:

$('<form method="post" style="display:none;">') 
    .attr('action', 'xxx') 
    .append(
     $('<input>').val(JSON.stringify(data)) 
    ).appendTo('body') 
    .submit(); 

Sul lato server, si dovrebbe accettare JSON modo regolare quando il tipo di contenuto del richiesta è application/JSON e come i dati del modulo, per esempio:

json_string = request.form.get('__json') 
if json_string: 
    data = json.loads(json_string) 

ho mai provato, ma conosco il problema che stai riscontrando e può perdere un sacco di tempo. Se ci provi mi piacerebbe sapere come funziona.

+0

Immagino di voler continuare a riflettere su questo, ma non ho mai trovato abbastanza tempo. Ho giocato con questa soluzione alcuni mesi fa, e non ha funzionato. –

0

La risposta di Markus funziona perfettamente. grazie mille! questo mi ha salvato così tanto fastidio.

considerano anche assegnare i gestori a un oggetto jqxhr

http://api.jquery.com/jQuery.post/#jqxhr-object

var jqxhr = $.post(...) 

allora si può scrivere alla vostra nuova finestra

w.document.write(jqxhr.responseText); 
Problemi correlati