27 sept. 2016

Consulta a MongoDB desde Flask (parte 1)


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:


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 python
WORKDIR /code/
RUN pip3 install --upgrade pip
RUN pip3 install  pymongo
RUN pip3 install Flask
RUN pip3 install Flask-PyMongo
EXPOSE 5000
ADD ./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:
    - mongo
mongo:
  image: mongo
  ports:
    - "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 Flask
from flask import Flask
#Se importa PyMongo
from flask_pymongo import  PyMongo
#Se importa dumps de bson.json_util
from bson.json_util import dumps
#Se crea la instancia Flask
app = Flask(__name__)
#Se configura el acceso a la base de datos mongodb
app.config['MONGO_DBNAME'] = 'empleados'
app.config['MONGO_URI'] = 'mongodb://mongo:27017/empleados'
#Se asocia la configuración pasando la app
mongo = PyMongo(app)
#Se define la ruta raiz con metodo POST
@app.route('/',methods=['POST'])
def index():
    #Se realiza la conexion a la coleccion empleados
    empleados = mongo.db.empleados
    #Se hace la consulta y se devuelve  en formato json_util
    resultados = empleados.find()
    return dumps(resultados)
if __name__ == "__main__":
    #Se corre la aplicacion en modo debug
    app.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.
Publicar un comentario en la entrada

AddThis