Cómo construir API RESTful con Falcon

Introducción

Las API RESTful son un componente importante de cualquier pila bien diseñada, y Python tiene algunos marcos brillantes para componer API rápidamente.

Uno de estos marcos se llama Falcon, ¡y es genial! Esencialmente un microframework, se envía con una cantidad considerable de ventajas:

  1. Es rápido. Realmente rápido. Consulte los puntos de referencia aquí.
  2. Los recursos HTTP se definen como clases, y los métodos de clase se utilizan para diferentes operaciones REST en estos recursos. Esto ayuda a mantener una base de código limpia.
  3. Es bastante extensible: consulte esta sección en su wiki para familiarizarse con ella.
  4. Está basado en WSGI, el estándar Pythonic para aplicaciones web, por lo que funciona con Python 2.6, 2.7 y 3.3+. Y si necesita más rendimiento, ejecútelo con PyPy.

Empezando

Primero, preparemos nuestro entorno. En lo personal, siempre es un placer trabajar en entornos virtuales - se puede utilizar virtualenv, virtualenvwrappero venv. A continuación, instale Falcon utilizando pip: pip install falcon.

Vamos a desarrollar una pequeña API de muestra que realiza manipulaciones de zona horaria muy básicas para nosotros. Mostrará la hora actual en UTC, así como la hora de época correspondiente. A tal fin, vamos a agarrar una biblioteca ingeniosa llamada arrow: pip install arrow.

Puede encontrar la muestra terminada en //github.com/rudimk/freecodecamp-guides-rest-api-falcon.

Recursos

Piense en un recurso como una entidad que su API necesita manipular. En nuestro caso, el mejor recurso sería un Timestamp. Nuestro enrutamiento normalmente sería algo como esto:

GET /timestamp

Aquí, GETestá el verbo HTTP utilizado para llamar a este punto final, y /timestampes la URL en sí. Ahora que hemos sacado esto del camino, ¡creemos un módulo!

$ touch timestamp.py

Hora de importar la biblioteca Falcon:

import json import falcon import arrow

Tenga en cuenta que también hemos importado el jsonpaquete y la arrowbiblioteca. Ahora, definamos una clase para nuestro recurso:

class Timestamp(object): def on_get(self, req, resp): payload = {} payload['utc'] = arrow.utcnow().format('YYYY-MM-DD HH:mm:SS') payload['unix'] = arrow.utcnow().timestamp resp.body = json.dumps(payload) resp.status = falcon.HTTP_200

Repasemos este fragmento. Hemos definido una Timestampclase y definido un método de clase llamado on_get: esta función le dice a Falcon que cuando GETse emite una solicitud a un punto final para este recurso, ejecute la on_getfunción y proporcione los objetos de solicitud y respuesta como parámetros.

Después de eso, todo es fácil: creamos un diccionario vacío, lo llenamos con las marcas de tiempo UTC y UNIX actuales, lo convertimos a JSON y lo adjuntamos al objeto de respuesta.

Bastante simple, ¿verdad? Pero, lamentablemente, eso no es todo. Ahora necesitamos crear un servidor Falcon y conectar la clase de recursos que acabamos de definir a un punto final real.

$ touch app.py

Ahora, agregue el siguiente código:

import falcon from timestamp import Timestamp api = application = falcon.API() timestamp = Timestamp() api.add_route('/timestamp', timestamp)

Aquí, definimos una API Falcon e inicializamos una instancia de la clase de recursos que creamos anteriormente. Luego, hemos conectado el /timestamppunto final con la instancia de clase, ¡y ahora estamos listos para comenzar! Para probar esta API, instale gunicorn( pip install gunicorn) y ejecute gunicorn app. Utilice Postman o simple cURLpara probar esto:

$ curl //localhost:8000/timestamp {"utc": "2017-10-20 06:03:14", "unix": 1508479437}

¡Y eso es todo!

Hacia adelante

Una vez que domine Falcon, es muy fácil componer potentes API RESTful que interactúan con bases de datos o colas de mensajería. Consulte los documentos de Falcon, así como PyPI para conocer los módulos Falcon interesantes que siguen apareciendo.