Creación de la API RESTful con Flask: independiente de ORM
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 una API RESTful por nosotros mismos utilizando Flask como framework web. En la segunda parte, creamos una API RESTful usando Flask-Restless que depende de SQLAlchemy como ORM. En esta parte, usaremos otra extensión de Flask, Flask-Restful, que abstrae tu ORM y no hace ninguna suposición al respecto.
Tomaré la misma aplicación de muestra que en la última parte de esta serie para mantener el contexto y la continuidad. Aunque esta aplicación de ejemplo se basa en SQLAlchemy, esta extensión se puede usar junto con cualquier ORM de manera similar, como se muestra en este tutorial.
Instalación de dependencias
Mientras continuamos con la aplicación desde la primera parte, necesitamos instalar solo una dependencia:
1 |
$ pip install Flask-Restful |
La aplicación
Antes de empezar, es posible que quieras eliminar el código que escribimos para la segunda parte de esta serie de tutoriales para mayor claridad.
Como siempre, comenzaremos con cambios en la configuración de nuestra aplicación, que se parecerá a las siguientes líneas de código:
flask_app/my_app/__init__.py
1 |
from flask.ext.restful import Api |
2 |
|
3 |
api = Api(app) |
Basta con añadir las dos líneas anteriores al código existente.
flask_app/my_app/catalog/views.py
1 |
import json |
2 |
from flask import Blueprint, abort |
3 |
from flask.ext.restful import Resource |
4 |
from flask.ext.restful import reqparse |
5 |
from my_app.catalog.models import Product |
6 |
from my_app import api, db |
7 |
|
8 |
|
9 |
catalog = Blueprint('catalog', __name__) |
10 |
|
11 |
parser = reqparse.RequestParser() |
12 |
parser.add_argument('name', type=str) |
13 |
parser.add_argument('price', type=float) |
14 |
|
15 |
|
16 |
@catalog.route('/') |
17 |
@catalog.route('/home') |
18 |
def home(): |
19 |
return "Welcome to the Catalog Home." |
20 |
|
21 |
|
22 |
class ProductApi(Resource): |
23 |
|
24 |
def get(self, id=None, page=1): |
25 |
if not id: |
26 |
products = Product.query.paginate(page, 10).items |
27 |
else: |
28 |
products = [Product.query.get(id)] |
29 |
if not products: |
30 |
abort(404) |
31 |
res = {} |
32 |
for product in products: |
33 |
res[product.id] = { |
34 |
'name': product.name, |
35 |
'price': product.price, |
36 |
}
|
37 |
return json.dumps(res) |
38 |
|
39 |
def post(self): |
40 |
args = parser.parse_args() |
41 |
name = args['name'] |
42 |
price = args['price'] |
43 |
product = Product(name, price) |
44 |
db.session.add(product) |
45 |
db.session.commit() |
46 |
res = {} |
47 |
res[product.id] = { |
48 |
'name': product.name, |
49 |
'price': product.price, |
50 |
}
|
51 |
return json.dumps(res) |
52 |
|
53 |
api.add_resource( |
54 |
ProductApi, |
55 |
'/api/product', |
56 |
'/api/product/<int:id>', |
57 |
'/api/product/<int:id>/<int:page>'
|
58 |
)
|
La mayor parte del código anterior se explica por sí mismo. Sin embargo, destacaré algunos puntos. El código anterior parece muy similar al que escribimos en la primera parte de esta serie, pero aquí la extensión utilizada hace un montón de optimizaciones detrás de escena y proporciona muchas más funciones que se pueden aprovechar.
Aquí los métodos declarados bajo cualquier clase que subclase Resource se consideran automáticamente para el enrutamiento. Además, los parámetros que esperamos recibir junto con las llamadas HTTP entrantes deben analizarse mediante reqparse.
Prueba de la aplicación
Esta aplicación se puede probar exactamente de la misma manera que lo hicimos en la segunda parte de esta serie de tutoriales. Mantuve la misma URL de enrutamiento con el mismo propósito.
Conclusión
En esta última parte de esta serie de tutoriales de tres partes sobre el desarrollo de API RESTful con Flask, vimos cómo escribir una API RESTful independiente de ORM. Esto resume los conceptos básicos de la escritura de una API RESTful con Flask de varias maneras.
Se puede aprender más sobre cada uno de los métodos de los que hablamos, y puedes explorar esto por tu cuenta, utilizando los conceptos básicos que aprendiste en esta serie.



