2012-08-14 15 views
8

Conosco JSON per risolvere questo problema, ma ho problemi a implementarlo. Ecco il dettaglio del mio approccio:Invia dati da Python a Javascript (JSON)

  1. dati sono calcolati in Python
  2. Dal momento che la dimensione dei dati è dinamico, quindi ho bisogno di usare JavaScript per creare in più righe della tabella HTML per le mie uscite. Di conseguenza, ho bisogno di passare i dati da Python a JavaScript per consentire a Javascript di "vedere" i dati.

codice HTML (sotto è una sezione del mio codice HTML per creare la pagina di uscita):

class OutputPage(webapp.RequestHandler): 
    def func (a,b): 
     return a+b #just an example 

    def get(self): 
     form = cgi.FieldStorage() 
     chem_name = form.getvalue('chemical_name') 
     Para1 = form.getvalue('Para1') #get values from input page--user inputs 
     Para1 = float(Para1) 
     Para2 = form.getvalue('Para2') #get values from input page--user inputs 
     Para2 = float(Para2) 
     out = func (Para1,Para1) 
     out_json=simplejson.dumps(out) # I need to send out to JavaScript 
     #writ output page 
     templatepath = os.path.dirname(__file__) + '/../templates/' 
     html = html + template.render (templatepath + 'outputpage_start.html', {}) 
     html = html + template.render (templatepath + 'outputpage_js.html', {})    
     html = html + """<table width="500" class='out', border="1"> 
          <tr> 
          <td>parameter 1</td> 
          <td>&nbsp</td>        
          <td>%s</td> 
          </tr> 
          <tr> 
          <td>parameter 2</td> 
          <td>&nbsp</td>        
          <td>%s</td> 
          </tr>              
          </table><br>"""%(Para1, Para2) 
     html = html + template.render(templatepath + 'outputpage_end.html', {}) 
     #attempt to 'send' Python data (out_json) to JavaScript, but I failed. 
     html = html + template.render({"my_data": out_json}) 
     self.response.out.write(html) 

app = webapp.WSGIApplication([('/.*', OutputPage)], debug=True) 

codice JavaScript (io uso JavaScript per creare ulteriori tabelle ingressi sul nome del file fly: 'outputpage_js. html '):

Grazie per l'aiuto!

+0

Puoi spiegare, perché stai cercando di passare i dati nello stesso modello che genererà quindi il codice HTML? Non vedo alcun caricamento dinamico (come AJAX) nella tua domanda, solo il codice JavaScript non necessario che genererà parte del modello che non sei stato in grado di generare usando Python. Ho ragione? – Tadeck

+0

@Tadeck, la ragione per usare JavaScript è perché ho bisogno di usare JavaScript per creare tabelle html. Inoltre, la dimensione dei miei dati è dinamica. Quindi penso che sia meglio usare JSON per passare dati a JavaScript e lasciarlo gestire. Inoltre, ho anche bisogno di usare Jqplot per generare figure. Attualmente, genero tutti i valori in una tabella html nascosta e consento a JavaScript di ottenerli selezionando nomi id. Ma penso che ci dovrebbe essere un modo migliore per farlo. –

+0

@Tao, i dati vengono aggiornati in modo dinamico? Il significato vedrà l'utente cambiare i dati al volo senza un aggiornamento della pagina? Se è dinamico, è necessario il codice AJAX per richiedere i dati JSON da un URL che restituisce solo JSON (senza HTML). Se i dati sono noti quando viene caricata la pagina, è sufficiente aggiungere la struttura dei dati JavaScript al modello di pagina. Non sono richiesti JSON o AJAX. – jiggy

risposta

11

non si deve "attuare" JSON, pitone viene fornito con un costruito in lib, chiamato simplejson, che si può nutrire con dicts normali:

try: 
    import simplejson as json 
except: 
    import json 
out = {'key': 'value', 'key2': 4} 
print json.dumps(out) 

EDIT: come tadeck sottolineato , simplejson dovrebbe essere più up-to-date e non è uguale a jSON, ma c'è una possibilità, simplejson non è disponibile a causa di essa viene mantenuta l'esterno sia

EDIT 2: sulla base della discussione in questa risposta e la discussione sulla pagina, credo, l'approccio migliore sarebbe qualcosa di simile:

pitone

# [...] generate dynamic data [...] 
html = html + template.render (templatepath + 'outputpage_start.html', {}) 
html = html + template.render (templatepath + 'outputpage_js.html', {})    
html = html + """<table width="500" class='out' border="1" data-dynamic="%s">""" % json.dumps(your_generated_data_dict) 
#tr/td elements and templating as needet 
self.response.out.write(html) 

javascript

$(function(){ 
    var your_generated_table = $('table'), 
     dynamic_data = JSON.parse(your_generated_table.attr('data-dynamic')); 
}); 

hai quindi la stessa identica struttura di python dict come oggetto javascript.

+2

La libreria è semplicemente 'json' in python2.6 e versioni successive. – stderr

+0

grazie per avermi aggiornato, è da un po 'che ... – DesertEagle

+0

Grazie per il suggerimento. Puoi darmi un suggerimento su come combinare json.dumps nel mio caso (ho bisogno di renderlo? Dal momento che ho bisogno di lasciare JavaScript per vederlo)? –