Consulta a MongoDB desde Flask (parte 1)
En este artículo se usará Docker para construir la imagen que contiene el script en Flask con sus dependencias, se usará docker-compose.yml para asociar dicha imagen como contenedor con un contenedor de mongoDB.
Para revisar los artículos relacionados a este artículo pueden ver:
Para revisar los artículos relacionados a este artículo pueden ver:
Se tiene una colección empleados en una base de datos empleados con los siguientes datos:
[{"_id": {"$oid": "57eb0887c535b9e290a6386d"}, "nombre": "Jane Doe", "sexo": "femenino", "edad": 29.0}, {"_id": {"$oid": "57eb0892c535b9e290a6386e"}, "nombre": "John Doe", "sexo": "masculino", "edad": 39.0}, {"_id": {"$oid": "57eb1c16c535b9e290a6386f"}, "nombre": "Pedro Perez", "sexo": "masculino", "edad": 55.0}, {"_id": {"$oid": "57eb1c66c535b9e290a63870"}, "nombre": "Petra", "sexo": "femenino", "edad": 65.0}]
Estructura de archivos y directorios
La estructura de archivos y directorios del proyecto del artículo es la siguiente:
tutorial-flask
├── app
│ └── run.py
├── docker-compose.yml
├── Dockerfile
├── README.md
└── tmp
Archivo Dockerfile
El archivo Dockerfile usa de sistema base Python, e instalará las siguientes dependencias:
- Actualización de pip
- pymongo
- Flask
- Flask-PyMongo
Además expone el puerto 5000 y ejecuta el script run.py.
A continuación el contenido del archivo Dockerfile:
FROM pythonWORKDIR /code/RUN pip3 install --upgrade pipRUN pip3 install pymongoRUN pip3 install FlaskRUN pip3 install Flask-PyMongoEXPOSE 5000ADD ./app/* /code/COPY ./app/* /code/CMD python run.py
Archivo docker-compose.yml
El archivo docker-compose.yml define la construcción de la imagen Docker a partir del archivo Dockerfile, el puerto a exponer, el volumen a exponer y se enlaza con el contenedor mongo, el cual usa la imagen de mongo, expone el puerto 27017, y por último expone el volumen.
A continuación el contenido del archivo:
flask-mongo:build: .ports:- "5000:5000"volumes:- "./app/:/code"links:- mongomongo:image: mongoports:- "27017:27017"volumes:- "/srv/data/db:/data/db:rw"
Si se quiere que la base de datos mongodb sea pública se expone los puertos, si no, entonces no se define los puertos. Para el caso de manejar persistencia de datos en la base de datos si es necesario definir el volumen.
Script run.py
Este script se muestra a continuación:
#!/usr/bin/env python#Se importa Flaskfrom flask import Flask#Se importa PyMongofrom flask_pymongo import PyMongo#Se importa dumps de bson.json_utilfrom bson.json_util import dumps#Se crea la instancia Flaskapp = Flask(__name__)#Se configura el acceso a la base de datos mongodbapp.config['MONGO_DBNAME'] = 'empleados'app.config['MONGO_URI'] = 'mongodb://mongo:27017/empleados'#Se asocia la configuración pasando la appmongo = PyMongo(app)#Se define la ruta raiz con metodo POST@app.route('/',methods=['POST'])def index():#Se realiza la conexion a la coleccion empleadosempleados = mongo.db.empleados#Se hace la consulta y se devuelve en formato json_utilresultados = empleados.find()return dumps(resultados)if __name__ == "__main__":#Se corre la aplicacion en modo debugapp.run(host="0.0.0.0",debug=True)
Crear la imagen Docker y ejecutar los contenedores
Para crear la imagen Docker se ejecuta:
docker-compose build
Para ejecutar los dos contenedores se ejecuta:
docker-compose up
A continuación se muestra los documentos de la colección desde robomongo:
Para realizar la consulta se usará postman (una aplicación para google chrome), a continuación se muestra la imagen del resultado de la consulta:
Al consultar vía POST a 127.0.0.1 puerto 5000, se devuelve el json con todos los empleados que se tienen en la base de datos mongodb.
El código fuente de este artículo lo pueden ver en la rama mongo1 en gitlab.
No hay comentarios:
Publicar un comentario