Blog
Aprender sobre los Namespaces en Flask
Crear un Namespace y estudiar sus métodos
Que es el Namespace
Para comprender lo que son los namespaces primero debemos saber que es un nombre en Python, Python trata todo como objetos (haciendo referencia a los objetos abstractos de la programación orientada a objetos) de manera que los nombres son la palabra que identifica a cada objeto, cuando nos referimos a un namespace es simplemente una lista de nombres, esta lista sigue la regla de que no pueden haber nombres repetidos, es posible tener varios namespaces los cuales pueden coexistir en un momento dado, sin embargo estos estarán aislados.
En nuestro caso usaremos los namespaces para crear los nombres de cada endpoint de nuestro API, un endpoint no es mas que la URL a través de la cual nuestro recurso o servicio va a poder ser accedido desde una aplicación cliente, así tendremos varios endopoints generalmente uno por cada recurso, el cual tendrá variaciones dependiendo del protocolo a través del cual lo suministramos.
Creando Namespace
Para crear nuestro namespace debemos agregar un nuevo archivo para el control de nuestra API, de manera que podamos manipular las peticiones que recibimos y dar una respuesta adecuada, entonces crearemos el archivo hotel_api.py dentro de la carpeta app/api con lo cual comenzamos agregando el siguiente código:
archivo hotel_api.py
from flask import jsonify from flask_restplus import Resource, Namespace from app.extensions import db from app.model.hotel import Hotel hotels = Namespace('hotels') @hotels.route('') class HotelsHandler(Resource): def get(self): pass def post(self): pass @hotels.route('/<int:id>') class HotelHandler(Resource): def get(self, id): pass def put(self, id): pass def delete(self, id): pass
Como vemos en nuestro archivo hotel_api.py estamos al inicio creando nuestro namespace para el manejo de hoteles, de manera que las rutas o endpoints con los que trabajaremos serán administrador por este namespace, también podemos ver la creación de 2 clases adicionales con los metodos get, post, put y delete, estos son los metodos básicos del protocolo HTTP el cual utilizaremos para poder enviar y recibir datos desde una aplicación cliente, pero aun falta la lógica así que vamos a ir agregando paso a paso el código necesario para poder manejar las peticiones:
Metodo GET
Como es una consulta sencilla simplemente tenemos que consultar la base de datos para traer todos los registros posibles y retornarlos al cliente en forma de json así que agregaremos el siguiente código en la primera función GET:
def get(self): hotels = Hotel.query.all() return jsonify([h.to_json() for h in hotels])
Metodo POST
En este caso vamos a tener que crear un Hotel y guardarlo en la base de datos con la información que recibimos, el código querdaría como sigue:
def post(self): data = self.api.payload h = Hotel.from_json(data) db.session.add(h) db.session.commit() return jsonify(h.to_json())
Metodo GET /id
Esta también será una consulta pero la aplicación cliente estará tratando de preguntar por un hotel en especifico mediante el campo ID así que vamos a a filtrar y el código quedaría así:
def get(self, id): hotel = Hotel.query.filter(Hotel.id==id).first() if not hotel: return self.api.abort(404, "Hotel id {} doesn't exist".format(id)) return jsonify(hotel.to_json())
Metodo PUT /id
En este caso tenemos que filtrar y luego modificar los datos en caso de encontrar un hotel con el id recibido, luego de modificarlo debemos guardar los cambios en la base de datos. El código quedaría así:
def put(self, id): data = self.api.payload hotel = Hotel.query.filter(Hotel.id==id).first() if not hotel: return self.api.abort(404, "Hotel id {} doesn't exist".format(id)) hotel.name = data.get('name', hotel.name) hotel.address = data.get('address', hotel.address) hotel.city = data.get('city', hotel.city) db.session.commit() return jsonify(hotel.to_json())
Metodo DELETE /id
En este caso tenemos que filtrar y luego eliminar el registro encontrado. El código quedaría así:
def delete(self, id): Hotel.query.filter(Hotel.id==id).first().delete() return jsonify(True)
Teniendo todas estas funciones ya creadas entonces el código final de nuestro hotel_api.py quedaría de la siguiente manera:
from flask import jsonify from flask_restplus import Resource, Namespace from app.extensions import db from app.model.hotel import Hotel from app.model.city import City hotels = Namespace('hotels') @hotels.route('') class HotelsHandler(Resource): def get(self): hotels = Hotel.query.all() return jsonify([h.to_json() for h in hotels]) def post(self): data = self.api.payload h = Hotel.from_json(data) db.session.add(h) db.session.commit() return jsonify(h.to_json()) @hotels.route('/<int:id>') class HotelHandler(Resource): def get(self, id): hotel = Hotel.query.filter(Hotel.id==id).first() if not hotel: return self.api.abort(404, "Hotel id {} doesn't exist".format(id)) return jsonify(hotel.to_json()) def put(self, id): data = self.api.payload hotel = Hotel.query.filter(Hotel.id==id).first() if not hotel: return self.api.abort(404, "Hotel id {} doesn't exist".format(id)) hotel.name = data.get('name', hotel.name) hotel.address = data.get('address', hotel.address) hotel.city = data.get('city_id', hotel.city) db.session.commit() return jsonify(hotel.to_json()) def delete(self, id): Hotel.query.filter(Hotel.id==id).first().delete() return jsonify(True)
Ahora vamos a tener que importar este api y namespace en los archivos base para poder hacer uso de nuestra API de forma correcta, vamos al archivo backend.py e importamos el api con el código siguiente:
NAMESPACES = [ hotels ]
y dentro de la función create_api agregamos lo siguiente:
for namespace in NAMESPACES: api.add_namespace(namespace)
para así poder utilizar nuestro API ahora solo falta un paso para terminar el tutorial y este se encuentra en la siguiente parte que es hacer pruebas de nuestro API con Postman.
➡ Felicidades, creando tus propios Namespaces podrás tener más control sobre las clases que definas. Continúa aprendiendo con nuestro curso creación de APIs RESTful con Flask – Python:
[…] ➡ API RESTful en Flask – Namespace […]