[v8] ¿Cómo recibir un JSON en un controlador y devolver una respuesta?

1,049 views
Skip to first unread message

Juan Formoso Vasco

unread,
Mar 10, 2016, 7:59:43 AM3/10/16
to Usuarios Odoo / OpenERP en España
Hola a todos:

Estoy intentando hacer un controlador que reciba datos en formato JSON, haga cualquier cosa con ellos, y tras esto, devuelva un 200 OK o cualquier respuesta.

De momento éste es el código de mi controlador:

import openerp.http as http
import logging
_logger
= logging.getLogger(__name__)


class Controller(http.Controller):

   
@http.route('/test/result', type='json', auth='public')
   
def index(self):
        _logger
.info('HOLA')
       
return '{"response": "OK"}'


Si ahora me dirijo a la URL http://localhost:8069/test/result, recibo un error 440 Bad Request: function index at 0x7f04a28>, /test/result: Function declared as capable of handling request of type 'json' but called with a request of type 'http', lo cual tiene sentido porque he puesto que el controlador sea de tipo json, si lo cambio por http, puedo ver claramente {"response": "OK"}.

Si ahora abro una consola de Python y escribo lo siguiente:

>>> import json
>>> data = {'temperature': '24.3'}
>>> data_json = json.dumps(data)
>>> data
{'temperature': '24.3'}
>>> data_json
'{"temperature": "24.3"}'
>>> import requests
>>> r = requests.get('http://localhost:30080/test/result', data=data_json)
>>> r
<Response [404]>

Podéis comprobar que no consigo mi objetivo, que es obtener en la variable "r" el json '{"response": "OK"}'. De hecho ni siquiera entra en el controlador ya que en el log no se muestra "HOLA" cada vez que ejecuto la petición, sólo "GET /test/result HTTP/1.1" 404 -.

He probado a cambiar el tipo de controlador de json a http y a añadirle el parámetro website con valor True por defecto, pero no hay manera, el resultado es el mismo.

¿Alguien sabe qué estoy haciendo mal?

Diego Vazquez

unread,
Mar 10, 2016, 8:08:54 AM3/10/16
to Usuarios Odoo / OpenERP en España
Aparentemente la definición está bien, y si comentas que en el navegador te responde bien... Lo único raro que veo es que el método devuelva un string (en lugar del json) y que en la prueba utilizas un puerto diferente para la petición.

Juan Formoso Vasco

unread,
Mar 10, 2016, 8:16:15 AM3/10/16
to Usuarios Odoo / OpenERP en España
Ah perdón, eso es un fallo al copiarlo aquí, yo en realidad estoy usando el puerto 30080 en ambos sitios, pero en la pregunta quise poner el 8069 para dejarla más estándar, porque es el que se usa por defecto. Se me olvidó cambiarlo.

¿A qué te refieres conque el método devuelva un string? En cualquier caso, al menos el HOLA debería mostrarlo en el log, ¿no?

Diego Vazquez

unread,
Mar 10, 2016, 8:55:10 AM3/10/16
to Usuarios Odoo / OpenERP en España
Una pregunta, 
es necesario pasarle ese data_json en la request?
Probaría yo en mi consola, pero tengo un problema con el tema de proxies y hosts en mi entorno y no funcionaría

Juan Formoso Vasco

unread,
Mar 10, 2016, 9:02:04 AM3/10/16
to Usuarios Odoo / OpenERP en España
Pues en principio sí, porque mi objetivo al final es que al controlador le llegue el JSON y pueda trabajar con él antes de devolver una respuesta. Si hay otra manera de hacerlo, entonces perfecto, pero bueno, los requisitos son: recibir un JSON y devolver una respuesta.

De todas formas, estoy probando también en la consola de Python sin enviar el JSON, y siempre me devuelve 404.

Diego Vazquez

unread,
Mar 10, 2016, 11:09:03 AM3/10/16
to Usuarios Odoo / OpenERP en España
¿y probando a llamar utilizando rpc en openerp javascript?

Jose Zambudio (@Zamberjo)

unread,
Mar 10, 2016, 12:01:37 PM3/10/16
to Usuarios Odoo / OpenERP en España
Hola,

Por lo que veo, y lo poco que he tocado de los controladores, creo que tienes 2  puntos mal:
  1. debes indicar "params" en la petición del requets, algo tal que: requests.post('http://localhost:30080/test/result', json={"params": {'temperature': '24.3'}})
  2. creo que con auth public debes indicar la base de datos (en la sesión), mira antes la documentación a ver, pero creo que con none no hace falta.
Un saludo,

Juan Formoso Vasco

unread,
Mar 11, 2016, 3:47:37 AM3/11/16
to Usuarios Odoo / OpenERP en España
Hola Jose:

He quitado lo de public, y he puesto none en su lugar. También he puesto params en el JSON como única clave. He probado a cambiar también la petición de get a post, como escribiste arriba, aunque también he probado con get con esta nueva configuración, y obtengo el mismo error 404. He probado todas las combinaciones, tipo http, tipo json, incluso cambiando el parámetro website (cuya diferencia por lo que veo es que errores que obtienes accediendo al controlador desde un navegador salgan con los estilos CSS de Odoo en lugar de sin ningún estilo).

¿Qué puede estar fallando?

Juan Formoso Vasco

unread,
Mar 11, 2016, 8:13:14 AM3/11/16
to Usuarios Odoo / OpenERP en España
Bueno, ya me he dado cuenta de cuál era el problema. En el puerto 30080 tengo varias bases de datos. Desde consola, no se sabe a qué base de datos de la instancia se está haciendo la petición, y devuelve un 404. Sin embargo, si sólo tienes una base de datos en la instancia de Odoo, la petición sabe que tiene que ser ésa a narices, y recoge la respuesta del controlador perfectamente.

Como no quería eliminar las otras bases que tengo en mi instancia, he cambiado temporalmente el archivo de configuración, el parámetro db_filter, para mostrar sólo la que tiene mi módulo instalado (el del controlador).

Ahora mi pregunta es otra: ¿hay alguna manera de tener varias bases de datos en la misma instancia y que la petición pueda hacer referencia a una base de datos concreta, para asegurarse de que el controlador siempre funcione (sin utilizar db_filter)?

Jose Zambudio (@Zamberjo)

unread,
Mar 11, 2016, 11:22:06 AM3/11/16
to Usuarios Odoo / OpenERP en España

Carlos Alberto Florio Luis

unread,
Mar 14, 2020, 6:54:08 AM3/14/20
to Usuarios Odoo / OpenERP en España
Hola tengo exactamente el mismo problema pero yo solo tengo una sola base de datos, queria saber si tienen algun controlador basico que me funicone o si me pueden decir que estoy haciendo mal, muchas gracias
Reply all
Reply to author
Forward
0 new messages