2012-08-30 15 views
14

Dentro de una aplicación Frasco, tengo la siguiente llamada AJAX:Frasco Python, intentando lista o dict volver a Ajax llamada

$.ajax({ 
      url: "{{ url_for('bookings.get_customer') }}", 
      type: "POST", 
      data: nameArray, 
      success: function(resp){ 
       console.log(resp) 
      } 
     }) 

Como se puede ver, estoy pasando un array contra el cual voy a buscar mi base de datos mongo, que devolverá o no devolverá un cliente.

Por lo tanto, la definición de Python que es responsable de manejar esta llamada AJAX es:

@bookings.route('/get_customer', methods=[ 'POST' ]) 
def get_customer(): 
    name = {} 
    for key, value in request.form.items(): 
    name[ key ] = value 

    customer_obj = customer_class.Customer() 
    results = customer_obj.search_customer(name) 

    return results  

Por motivo de la discusión, digamos la llamada customer_obj devuelve la lista siguiente:

[{'customer': { 
       u'first_name': u'Dave', 
       u'tel': u'0121212121458', 
       u'country': u'UK',  
       u'address2': u'Townington', 
       u'address3': u'Cityville', 
       u'email': u'[email protected]', 
       u'postcode': u'A10 5BC', 
       u'address1': u'10 High Street', 
       u'second_name': u'Smith' 
      }, 
'customer_id': u'DaveSmithA10 5BCCat_Vegas1346244086' 
}] 

Cuando intento para devolver esto a la llamada AJAX como

return results 

me sale el siguiente error:

TypeError: 'list' object is not callable 

Aquí es el rastreo:

Traceback (most recent call last): 
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1701, in __call__ 
return self.wsgi_app(environ, start_response) 
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1689, in wsgi_app 
response = self.make_response(self.handle_exception(e)) 
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1687, in wsgi_app 
response = self.full_dispatch_request() 
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1361, in 
full_dispatch_request 
response = self.make_response(rv) 
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1450, in make_response 
rv = self.response_class.force_type(rv, request.environ) 
File "/usr/local/lib/python2.7/dist-packages/werkzeug/wrappers.py", line 711, in 
force_type 
response = BaseResponse(*_run_wsgi_app(response, environ)) 
File "/usr/local/lib/python2.7/dist-packages/werkzeug/test.py", line 818, in 
run_wsgi_app 
app_iter = app(environ, start_response) 
TypeError: 'list' object is not callable 

¿Alguien tiene alguna sugerencia?

Gracias

+0

¿Está todo bien con indentions? parece que 'return results' no está en el lugar correcto en tu código ... –

+0

Hola, sí, lo siento, es un error de mi parte. Lo he corregido ahora. – Ste77

Respuesta

29

frasco no espera que va a regresar list objeto a partir de su función de vista. Trate jsonify antes:

from flask import jsonify 

@bookings.route('/get_customer', methods=[ 'POST' ]) 
def get_customer(): 
    name = {} 
    for key, value in request.form.items(): 
     name[ key ] = value 

    customer_obj = customer_class.Customer() 
    results = customer_obj.search_customer(name) 

    return jsonify(customers=results)  
+0

Sí, lo siento, he estado experimentando con el envío de dictados y listas para ver si hacía alguna diferencia. He actualizado mi pregunta para hacerla coherente, me perdí en el detalle :). Voy a intentar tu sugerencia ahora. – Ste77

+0

Actualizado mi respuesta. –

+0

Eres un erudito y un caballero, funciona. Tuve que devolver un dict en lugar de una lista - devolvió jsonify (** results [0]), que no es exactamente lo que quiero, pero puedo obtener una solución para eso fácilmente. Gracias. – Ste77

5

que tiene que hacer

return jsonify(result=your_result) 

También puedes ver documentation que podría ser realmente útil.

+0

Gracias por el enlace. – Ste77

8

josonify funciona ... pero si tiene la intención de pasar una matriz sin la clave 'resultados', puede usar la biblioteca json de python. La siguiente conversión funciona para mí ...

import json 

@app.route('/test/json') 
def test_json(): 
list = [ 
     {'a': 1, 'b': 2}, 
     {'a': 5, 'b': 10} 
     ] 
return json.dumps(list) 
+1

Un problema con este enfoque es que Flask enviará el agregado incorrecto al encabezado 'Content-Type'. Se establecerá en 'text/html; charset = utf-8', en lugar de la 'aplicación/json 'semánticamente correcta –

Cuestiones relacionadas