2012-08-14 26 views
8

Sé que JSON resolverá este problema, pero tengo problemas para implementarlo. Ahí está el detalle de mi enfoque:Enviar datos de Python a Javascript (JSON)

  1. Los datos se calculan en Python
  2. Dado que el tamaño de los datos es dinámica, por lo que es necesario utilizar JavaScript para crear filas de la tabla HTML adicionales para mis salidas. Como resultado, necesito pasar datos de Python a JavaScript para permitir que Javascript 'vea' los datos.

Código HTML (por debajo de una sección de mi código HTML para crear la página de salida):

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) 

Código JavaScript (que usar JavaScript para crear tablas adicionales entradas en el nombre del archivo de la mosca: 'outputpage_js. html '):

<script> 
<script type='text/javascript'> 

$(document).ready(function(){ 
    //I assume if my Json statement works, I should be able to use the following argument to create a HTML row 
    $('<tr><td>Parameter 2</td><td>&nbsp</td><td>out_json</td>').appendTo('.app') 

</script>  

¡Gracias por la ayuda!

+0

¿Podría explicarnos, por qué exactamente intentan pasar datos en la misma plantilla que generará código HTML? No veo ninguna carga dinámica (como AJAX) en tu pregunta, solo código JavaScript no necesario que generará parte de la plantilla que no pudiste generar usando Python. ¿Estoy en lo correcto? – Tadeck

+0

@Tadeck, la razón para usar JavaScript es porque necesito usar JavaScript para crear tablas html. Además, el tamaño de mis datos es dinámico. Así que creo que es mejor usar JSON para pasar datos a JavaScript y dejar que lo maneje. Además, también necesito usar Jqplot para generar figuras. Actualmente, genero todos los valores en una tabla html oculta y dejo que JavaScript los obtenga seleccionando nombres de identificación. Pero creo que debería haber una mejor manera de hacer esto. –

+0

@Tao, ¿los datos se están actualizando dinámicamente? ¿El usuario verá el cambio de datos sobre la marcha sin una actualización de página? Si es dinámico, necesitaría un código AJAX para solicitar los datos JSON de una URL que solo devuelve JSON (sin HTML). Si se conocen los datos cuando se carga la página, solo necesita agregar la estructura de datos de JavaScript a su plantilla de página. No se requiere JSON o AJAX. – jiggy

Respuesta

11

que no tiene que "poner en práctica" JSON, pitón viene con un sistema incorporado en lib, llamado simplejson, que se puede alimentar con predice normales:

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

EDIT: como tadeck señalado , simplejson debería estar más al día y no es igual a JSON, pero existe la posibilidad, simplejson no está disponible debido a que se mantiene externaly

EDIT 2: basado en el análisis de esta respuesta y la discusión sobre la página, creo, el mejor enfoque sería algo así:

pitón

# [...] 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')); 
}); 

tiene la misma estructura que su dict python tiene como un objeto javascript.

+2

La biblioteca es simplemente 'json' en python2.6 en adelante. – stderr

+0

gracias por actualizarme, ha pasado un tiempo ... – DesertEagle

+0

Gracias por la sugerencia. ¿Puede darme una pista sobre cómo combinar json.dumps en mi caso (¿tengo que presentarlo? ¿Ya que necesito dejar que JavaScript lo vea)? –

Cuestiones relacionadas