jquery ajax para pasar un objeto json

740 views
Skip to first unread message

Jacinto Parga

unread,
Dec 14, 2014, 6:49:14 AM12/14/14
to web2py-...@googlegroups.com
Hola, 

Quiero pasar unos datos desde el navegador en cuanto se carga la página hacia el controlador. Este es el código que he empleado:

En la vista:
<script>
    
$(document).ready(function(){
  $.ajax({
    type: 'POST',
    contentType: "application/json; charset=utf-8",
    datatype:"json",
    data: {'key':'value','key2':'value2'},
    success:  function(data){  alert('yay'); }
});
});
</script>

En el controdador:

def index():
   import gluon.contrib.simplejson
   data = gluon.contrib.simplejson.loads(request.document.read())
      return dict()

El error que me da es el siguiente:

<class 'gluon.contrib.simplejson.decoder.JSONDecodeError'> No JSON object could be decoded: line 1 column 0 (char 0)

No veo qué estoy haciendo mal, ¿me pueden ayudar?
Gracias

Jacinto Parga

unread,
Dec 14, 2014, 6:59:04 AM12/14/14
to web2py-...@googlegroups.com
Perdon el controlador es: 

def index():
   import gluon.contrib.simplejson
   data = gluon.contrib.simplejson.loads(request.body.read())
      return dict()

Jacinto Parga

unread,
Dec 16, 2014, 4:30:05 AM12/16/14
to web2py-...@googlegroups.com
He probado con un ejemplo más simple todavía, que no me da errores, pero no pasa ningún dato:

Vista:
{{extend 'layout.html'}}
<h1>Esta es la plantilla default/test2.html</h1>
{{=BEAUTIFY(response._vars)}}

<script>
$(document).ready(function(){

    $.post("test2.json",
           {
               Nombre:"Paco",
               hora:"Las cinco"
           },
    function(data,status){
      alert("Data: " + data + "\nStatus: " + status);
    });

});
</script>

Controlador:
def test2():
    datos = str(request.vars)
    datos2= request.args(0)
    return locals()

Resultado:

Como veis no me pasa ninguna variable. No veo el error. Agradezco ayuda, el obejtivo es obtener en el controlador los datos que capturo con el script del navegador. 



El domingo, 14 de diciembre de 2014 12:49:14 UTC+1, Jacinto Parga escribió:

isi_jca

unread,
Dec 17, 2014, 11:45:11 AM12/17/14
to web2py-...@googlegroups.com
Jacinto:

¿Podrías ser más especifico sobre que datos tenés la intención de enviar desde la vista al controlador?

Saludos!!!

Federico Ferraro

unread,
Dec 17, 2014, 11:56:23 AM12/17/14
to web2py-...@googlegroups.com
Hola .. probaría con la url completa : 

 $.post("/app/controler/func.json",
           {Nombre:"Paco",hora:"Las cinco"},
    function(data,status){
      alert("Data: " + data + "\nStatus: " + status);
    },"json");

La consola del navegador arroja algún error ??? 

Slds ... 

--
Has recibido este mensaje porque estás suscrito al grupo "web2py-usuarios" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a web2py-usuari...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.


--
--
Federico Ferraro
Usuario Linux : 482533.
--

Jacinto Parga

unread,
Dec 17, 2014, 2:20:50 PM12/17/14
to web2py-...@googlegroups.com
Sí, lo que busco es almacenar las coordandas geográficas que captura el ordenador y poder manejarlas para incluirlas en una tabla que completo con otros datos introducidos a través de un formulario.

He progresado un poco y actualmente estoy en esta situación:

Vista:


{{extend 'layout.html'}}

<h5>
    Coordenadas obtenidas a través de innerHTML
</h5>
<p id="demo"></p>

<h2> Formulario para el check</h2>

{{=form}}

{{=datos}}
<script>
var x = document.getElementById("demo");

window.onload = function getLocation() {
    if (navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(showPosition);
        
    } else { 
        x.innerHTML = "Geolocation is not supported by this browser.";
    }
}

function showPosition(position) {
    x.innerHTML =  [position.coords.latitude,  position.coords.longitude];

  $.ajax({
    type: 'POST',
    url: '{{=URL('default', 'index.json',args='datos')}}',
    datatype:"json",
    data: {'f_latitud':+ position.coords.latitude,'f_longitud': + position.coords.longitude},
    success:  function(data){alert(data.datos); }
});
    }
</script>

Controlador:

def index():
         db.t_checkreg.f_latitud.default=5555.55
    db.t_checkreg.f_longitud.default=5555.55
    form=SQLFORM(db.t_checkreg)
    if form.process().accepted:
       response.flash = 'form accepted'
    elif form.errors:
       response.flash = 'form has errors'
    datos = str(request.vars)
    return locals()

Resultado:

Como veis, en la ventana de alerta capturo correctamente el json  con los campos y su valor. Pero en la variable datos que declaro en el controlador como datos=str(request.vars) su valor es <Storage{}> , es decir está vacio ya que no se llegan a almacenar las variables pasadas por el script.

Mi objetivo es pasar las coordenadas a través de db.t_check.f_latitud.default=datos.f_latitud

El problema, ahora, es cómo hago para que las variables del json, que se leen en la ventana de alerta se pasen a la varible datos, es decir, de algún modo tengo que declarar un evento que haga que se almacenen en request.vars

¿Me podríais ayudar?

Jacinto Parga

unread,
Dec 17, 2014, 2:27:32 PM12/17/14
to web2py-...@googlegroups.com
Hola, no he conseguido depurar todos los errores, y con tu propuesta funciona bien la alerta. El problema que tengo es cómo pasar los valores del json a una variable en el controlador para poder manipularlas y almacenarlas en base de datos a través de un formulario.

He puesto cómo está ahora en la entrada anterior.

Federico Ferraro

unread,
Dec 17, 2014, 3:12:48 PM12/17/14
to web2py-...@googlegroups.com
Probaria: 
request.body.read()  en vez de request.vars 

Fijate el contenido ... 

Slds... 

Jacinto Parga

unread,
Dec 17, 2014, 4:13:59 PM12/17/14
to web2py-...@googlegroups.com
Con eso no me sale nada, y si uso
datos = gluon.contrib.simplejson.loads(request.body.read()) me sale el error de que no encuentra un objeto json.

Federico Ferraro

unread,
Dec 17, 2014, 4:58:46 PM12/17/14
to web2py-...@googlegroups.com
El error esta en : 
url: '{{=URL('default', 'index.json',args='datos')}}',

debería: 
url: '{{=URL('default', 'index', args='datos')}}',

Slds .. 

Jacinto Parga

unread,
Dec 23, 2014, 7:04:07 AM12/23/14
to web2py-...@googlegroups.com
Hola,

antes de nada muchas gracias por tu ayuda Federico, al final ya lo he conseguido.

Tenía un error de concepto. Para obtener los valores del cliente necesito declarar una variable con una estructura que me permita almacenarlos. Eso lo hacía con:

datos = str(request.vars)

Esto funcionaba, puesto que puedo recuperar como string :  

data: {'f_latitud':+ position.coords.latitude,'f_longitud': + position.coords.longitude}

No obstante no es la forma adecuada. La forma adecuada es la que reproduce con mayor fidelidad la estructura de los datos y me permite manipularla: 

datos = [str(request.vars.f_latitud),str(request.vars.f_longitud)]

De esta forma, puedo recuperarlos en el cliente simplemente poniendo:
data.datos[0], data.datos[1]


Después quería enviar esos valores al controlador. Finalmente lo he hecho a través de los campos de un formulario utilizado jquery.var(data.datos[0]) de la siguiente forma: 

$("#test").val(data.datos[0]);

Así, con la etiqueta #test asigno al id del campo de un formulario el valor que quiero.

Lo dicho, muchas gracias por tu ayuda, que me ha sido muy útil.

Jacinto Parga

unread,
Jan 29, 2015, 4:42:06 PM1/29/15
to web2py-...@googlegroups.com
Resuelto, estaba ofuscado:
Utilizo ajax, las paso como id a <div id='mivariable'> y ahí las asigno a un formulario. Después con form.vars las utilizo en el controlador...

Gracias

Luis Díaz

unread,
Feb 1, 2015, 9:07:33 AM2/1/15
to web2py-...@googlegroups.com
asludos,

usa mejor:
from gluon.serializers import loads_json

if request.vars:
for row_vars in request.vars:
dato = loads_json(row_vars)
for row in dato:
if row == 'key':
key =row['key']
elif row == 'key2':
key2 =row['key2']
> --
> Has recibido este mensaje porque estás suscrito al grupo "web2py-usuarios"
> de Grupos de Google.
> Para anular la suscripción a este grupo y dejar de recibir sus mensajes,
> envía un correo electrónico a web2py-usuari...@googlegroups.com.
> Para acceder a más opciones, visita https://groups.google.com/d/optout.



--
http://diazluis.com
Analista Programador
User Linux 532223

Carlos becerra lopez

unread,
Aug 18, 2015, 10:30:24 PM8/18/15
to web2py-usuarios
Jacinto Parga espero te encuentres muy bien, sabes?. estoy tratando de introducir  los datos de Longitud y Latitud en los campos de una tabla pero no sé cómo hacerlo, es decir, tengo los datos en unas variables , pero no paso de ahí. Por lo que leí, también hiciste algo similar y por lo mismo quería pedirte un gran favor,
si me dices exactamente cómo quedó tu código en el controlador y la vista, soy nuevo en este asunto y me he quedado atorado.

Agradezco mucho tu ayuda y te mando un saludo.

Carlos becerra lopez

unread,
Aug 19, 2015, 12:49:16 AM8/19/15
to web2py-usuarios
Jacinto espero te encuentres bien, te comento que estoy tratando de introducir los datos de latitud y longitud en los campos de una tabla desde mi vista, solo tengo contenidos los datos de latitud y longitud en unas variables pero de ahí no paso,
por lo que leí, hace un tiempo también hiciste algo parecido y lo solucionaste, por lo mismo quería pedirte el gran favor si me facilitas el código del controlador y la vista para ver como superaste esta prueba. Soy nuevo en este asunto y me he quedado atorado.

Agradezco mucho tu ayuda y recibe un saludo.

El domingo, 14 de diciembre de 2014, 5:49:14 (UTC-6), Jacinto Parga escribió:

Jacinto Parga

unread,
Aug 19, 2015, 3:40:40 AM8/19/15
to web2py-usuarios
Hola Carlos, 

lo he hecho a través de un formulario. Estos son los códigos resumidos (por supuestos los scripts de la api de google maps estarán actualizados en la documentación de google maps).

Controdador:
    def check():
         latit=' '
    longi=''
    db.t_tutabla.f_latitud.writable=True
    db.t_tutabla.f_longitud.writable=True
    form=SQLFORM(db.tutabla)

    if form.process().accepted:
       response.flash = 'form accepted'
       latit=form.vars.f_latitud
       longi=form.vars.f_longitud
    elif form.errors:
       response.flash = 'El check tiene errores. No se ha registrado'
    db.t_tutabla.f_latitud.writable=False
    db.t_tutabla.f_longitud.writable=False
    return locals()

Lo de writable es porque en el modelo lo pongo False por defecto

La vista:

{{=form.custom.begin}}
    
 
<input name="f_latitud" type="hidden" id="lat" value="0.0" readonly>
<input name="f_longitud" type="hidden" id="lon" value="0.0" readonly>
    


    <button type="submit" class="btn" >Enviar</button>
    

{{=form.custom.end}}

<script>
var geocoder = new google.maps.Geocoder(); 
    
window.onload = function getLocation() {
  
        
 function error(err) {
  x.innerHTML = "ERROR. Este navegador no soporta geolocalización. Por favor actívala o utiliza otro navegador.";
};

function showPosition(position) {
     display.innerHTML = '<img src="http://maps.googleapis.com/maps/api/staticmap?center='+position.coords.latitude+','+ position.coords.longitude+'&zoom=16&size=300x100&markers=color:red%7Ccolor:red%7Clabel:R%7C'+position.coords.latitude+','+ position.coords.longitude+'&sensor=true">';
    x.innerHTML =  [position.coords.latitude,  position.coords.longitude, position.coords.accuracy,currentTime,navegador];
    $("#lat").val(position.coords.latitude);
    $("#lon").val(position.coords.longitude);
    
}                
navigator.geolocation.getCurrentPosition(showPosition,error,options);
    }
</script>


Con esto tendrás en las variables del formulario la longitud y la latitud. El formulario carga los datos en db.tutabla

Además como alternativa longitud y latitud quedan almacenadas en las variables del controlador lati y longi para que hagas con ellas lo que te parezca oportuno.

Espero que te sirva.

Un saludo

Carlos becerra lopez

unread,
Aug 19, 2015, 10:14:24 AM8/19/15
to web2py-...@googlegroups.com
Mil gracias Jacinto, claro que será de muchísima utilidad.

De verdad que nada me agradaría más que en el futuro pudiera corresponderte de igual manera,
mientras recibe todos mis respetos y un fuerte abrazo.

Saludos y excelente día.

--
Has recibido este mensaje porque estás suscrito a un tema del grupo "web2py-usuarios" de Grupos de Google.
Para anular la suscripción a este tema, visita https://groups.google.com/d/topic/web2py-usuarios/g4IVtc1NOeQ/unsubscribe.
Para anular la suscripción a este grupo y a todos sus temas, envía un correo electrónico a web2py-usuari...@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages