Spanish (Español) translation by Andrea Jiménez (you can also view the original English article)
En la primera parte de esta serie de tutoriales de tres partes, vimos cómo escribir APIs RESTful por nosotros mismos utilizando Flask como framework web. El enfoque anterior proporcionaba mucha flexibilidad, pero también incluía escribir una gran cantidad de código que de otro modo podría haberse evitado en casos más genéricos.
En esta parte, usaremos una extensión Flask, Flask-Restless, que simplemente genera APIs RESTful para modelos de base de datos definidos con SQLAlchemy. Tomaré la misma aplicación de ejemplo que en la última parte de esta serie para mantener el contexto y la continuidad.
Instalación de dependencias
Mientras continuamos con la aplicación desde la primera parte, necesitamos instalar solo una dependencia:
$ pip install Flask-Restless
La aplicación
Flask-Restless
hace que agregar interfaces API RESTful a modelos escritos con SQLAlchemy sea pan comido. En primer lugar, agrega el APIManager
REST de la extensión flask.ext.restless
al archivo de configuración de la aplicación.
flask_app/my_app/__init__.py
from flask.ext.restless import APIManager manager = APIManager(app, flask_sqlalchemy_db=db)
Basta con añadir las dos líneas anteriores al código existente.
flask_app/my_app/catalog/views.py
Este archivo comprende la mayor parte de los cambios de la parte anterior. A continuación se muestra el archivo reescrito completo.
from flask import Blueprint from my_app import manager from my_app.catalog.models import Product catalog = Blueprint('catalog', __name__) @catalog.route('/') @catalog.route('/home') def home(): return "Welcome to the Catalog Home." manager.create_api(Product, methods=['GET', 'POST'])
Es bastante evidente cómo funcionaría el código anterior. Acabamos de importar el manager
que se creó en un archivo anterior y se usa para crear una API para el modelo Product
con los methods
(métodos) listados. Podemos añadir más métodos como DELETE
, PUT
, PATCH
, u otros según sea necesario.
Aplicación en acción
Probemos esta aplicación creando algunos productos y enumerándolos. El punto de conexión creado por esta extensión de forma predeterminada es http://localhost:5000/api/product
.
Como hice en la última parte de esta serie de tutoriales, probaré esto usando la biblioteca requests
a través de la terminal.
>>> import requests >>> import json >>> res = requests.get('http://127.0.0.1:5000/api/product') >>> res.json() {u'total_pages': 0, u'objects': [], u'num_results': 0, u'page': 1} >>> d = {'name': u'iPhone', 'price': 549.00} >>> res = requests.post('http://127.0.0.1:5000/api/product', data=json.dumps(d), headers={'Content-Type': 'application/json'}) >>> res.json() {u'price': 549.0, u'id': 1, u'name': u'iPhone'} >>> d = {'name': u'iPad', 'price': 649.00} >>> res = requests.post('http://127.0.0.1:5000/api/product', data=json.dumps(d), headers={'Content-Type': 'application/json'}) >>> res.json() {u'price': 649.0, u'id': 2, u'name': u'iPad'} >>> res = requests.get('http://127.0.0.1:5000/api/product') >>> res.json() {u'total_pages': 1, u'objects': [{u'price': 549.0, u'id': 1, u'name': u'iPhone'}, {u'price': 649.0, u'id': 2, u'name': u'iPad'}], u'num_results': 2, u'page': 1}
Cómo personalizar
Es realmente útil tener las APIs RESTful creadas automáticamente, pero cada aplicación tiene cierta lógica comercial que requiere personalizaciones, validaciones y manejo inteligente/seguro de solicitudes según sea necesario.
Aquí, solicita preprocessors
y postprocessors
que vengan al rescate. Como indican los nombres, los métodos designados como preprocesadores se ejecutan antes del procesamiento de la solicitud, y los métodos designados como posprocesadores se ejecutan después del procesamiento de la solicitud. create_api()
es el lugar donde se definen como diccionarios del tipo de solicitud (GET
, POST
, entre otros) y los métodos como lista que actuarán como preprocesadores o posprocesadores en la solicitud especificada. A continuación se muestra un ejemplo de la plantilla:
manager.create_api( Product, methods=['GET', 'POST', 'DELETE'], preprocessors={ 'GET_SINGLE': ['a_preprocessor_for_single_get'], 'GET_MANY': ['another_preprocessor_for_many_get'], 'POST': ['a_preprocessor_for_post'] }, postprocessors={ 'DELETE': ['a_postprocessor_for_delete'] } )
Las solicitudes GET
, PUT
y PATCH
tienen la flexibilidad de ser disparadas para registros individuales y múltiples; por lo tanto, tienen dos tipos cada uno. En el código anterior, observa GET_SINGLE
y GET_MANY
para las solicitudes GET
.
Los preprocesadores y posprocesadores aceptan diferentes parámetros para cada tipo de solicitud y funcionan sin ningún valor de retorno. Esto queda para que lo intentes por cuenta propia.
Conclusión
En esta parte de esta serie de tutoriales, vimos cómo crear una API RESTful usando Flask simplemente agregando un par de líneas a un modelo basado en SQLAlchemy.
En la próxima y última parte de esta serie, hablaré sobre cómo crear una API RESTful usando otra extensión popular de Flask, pero esta vez, la API será independiente de la herramienta de modelado utilizada para la base de datos.