Web2py - Servicios

web2py proporciona soporte para varios protocolos como XML, JSON, RSS, CSV, XMLRPC, JSONRPC, AMFRPC y SOAP. Cada uno de esos protocolos se admite de varias formas, y hacemos una distinción entre:

  • Representar la salida de una función en un formato determinado.
  • Llamadas a procedimientos remotos.

Representación de un diccionario

Considere el siguiente código que mantiene el recuento de sesiones.

def count():
   session.counter = (session.counter or 0) + 1
   return dict(counter = session.counter, now = request.now)

La función anterior aumenta el número de recuentos cuando el usuario visita la página. Suponga que la función dada se define en“default.py”controlador de la aplicación web2py. La página se puede solicitar con la siguiente URL:http://127.0.0.1:8000/app/default/count

web2py puede representar la página anterior en diferentes protocolos y agregando una extensión a la URL, como:

http://127.0.0.1:8000/app/default/count.html

http://127.0.0.1:8000/app/default/count.xml

http://127.0.0.1:8000/app/default/count.json

El diccionario devuelto por la acción anterior se representará en HTML, XML y JSON.

Llamadas a procedimientos remotos

El framework web2py proporciona un mecanismo que convierte una función en un servicio web. El mecanismo descrito aquí difiere del mecanismo descrito anteriormente porque:

  • Inclusión de argumentos en función.
  • La función debe estar definida en un modelo.
  • Hace cumplir una convención de nomenclatura de URL más estricta.
  • Funciona para un conjunto fijo de protocolos y es fácilmente extensible.
  • Para utilizar esta función, es necesario importar e iniciar un objeto de servicio.

Para implementar este mecanismo, al principio, debe importar y crear una instancia de un objeto de servicio.

from gluon.tools import Service
service = Service()

Esto se implementa en el "db.py" archivo de modelo en la aplicación de andamios. Db.py model es el modelo predeterminado en el marco web2py, que interactúa con la base de datos y el controlador para lograr el resultado deseado para los usuarios.

Después de la implementación, se puede acceder al servicio en el modelo desde los controladores cuando sea necesario.

El siguiente ejemplo muestra varias implementaciones de llamadas a procedimientos remotos utilizando servicios web y muchas más.

Servicios web

Los servicios web se pueden definir como una forma estandarizada de integrar aplicaciones basadas en web utilizando protocolos como XML, SOAP, WSDL y UDDI.

web2py soporta la mayoría de ellos, pero la integración será bastante complicada.

Consumir un servicio JSON web2py con jQuery

Hay muchas formas de devolver JSON desde web2py, pero aquí consideramos el caso de un servicio JSON. Por ejemplo

def consumer():return dict()@service.json
def get_days():return ["Sun", "Mon", "Tues", "Wed", "Thurs", "Fri", "Sat"]
def call():return service()

Aquí, observamos que -

  • la función simplemente devuelve un diccionario vacío para representar la vista, que consumirá el servicio.

  • get_days define el servicio y la llamada a la función expone todos los servicios registrados.

  • get_days no necesita estar en el controlador y puede estar en un modelo.

  • call siempre está en el controlador de scaffolding default.py.

Ver con las acciones del consumidor son las siguientes:

{{extend 'layout.html'}}
<div id = "target"></div>

<script>
   jQuery.getJSON("{{= URL('call',args = ['json','get_days'])}}",
      function(msg){
         jQuery.each(msg, function(){ jQuery("#target").
         append(this + "<br />"); } )
      }
   );
</script>

El primer argumento de jQuery.getJSON es la URL del siguiente servicio: http://127.0.0.1:8000/app/default/call/json/get_days

Esto siempre sigue el patrón:

http://<domain>/<app>/<controller>/call/<type>/<service>

La URL está entre {{...}}, porque se resuelve en el lado del servidor, mientras que todo lo demás se ejecuta en el lado del cliente. El segundo argumento dejQuery.getJSON es una devolución de llamada, a la que se le pasará la respuesta JSON.

En este caso, la devolución de llamada recorre cada elemento de la respuesta (una lista de días de la semana como cadenas) y agrega cada cadena, seguida de una <br/> al <div id = "target">.

De esta forma, web2py gestiona la implementación de servicios web utilizando jQuery.getJSON.