Saltar al contenido principal

Ejemplo 10

MongoDB en una Aplicación Flask

En este tutorial, construirás una pequeña aplicación web que demuestra cómo usar la biblioteca PyMongo para interactuar con una base de datos MongoDB en Python.

Paso 1 — Configuración de PyMongo y Flask
Instala Flask y la biblioteca PyMongo en tu entorno virtual.

  1. Instalar el paquete python3-venv

    sudo apt install -y python3-venv
  2. Crear y activar el entorno virtual

    mkdir ~/myproject
    cd ~/myproject
    python3 -m venv myprojectenv
    source myprojectenv/bin/activate
  3. Instalar Flask y PyMongo

    pip install Flask flask_pymongo

Paso 2 — Instalar MongoDB y Configurar la Aplicación

Instalación de MongoDB

sudo apt update
curl -fsSL https://www.mongodb.org/static/pgp/server-6.0.asc | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/mongodb-6.gpg
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list
sudo apt update
sudo apt install -y mongodb-org
sudo systemctl enable --now mongod

Código de la Aplicación

Crea un archivo llamado app.py y agrega el siguiente código:

from flask import Flask, request, jsonify
from flask_pymongo import PyMongo
from bson import ObjectId, json_util

app = Flask(__name__)
app.config['MONGO_URI'] = "mongodb://localhost:27017/crud_db"
connect_db = PyMongo(app)

def convert_id(data):
if isinstance(data, ObjectId):
return str(data)
if isinstance(data, dict):
for key in data:
if isinstance(data[key], ObjectId):
data[key] = str(data[key])
elif isinstance(data[key], dict):
data[key] = convert_id(data[key])
return data

@app.route('/items', methods=['POST'])
def create_item():
data = request.json
result = connect_db.db.product.insert_one(data)
return jsonify({"status": "created successfully", "id": str(result.inserted_id)})

@app.route('/items', methods=['GET'])
def get_items():
data = connect_db.db.product.find()
return jsonify([convert_id(item) for item in data])

@app.route('/items/<id>', methods=['GET'])
def get_item(id):
item = connect_db.db.product.find_one({"_id": ObjectId(id)})
if item:
return jsonify(convert_id(item))
return jsonify({"error": "Item not found"}), 404

@app.route('/items/<id>', methods=['PUT'])
def update_item(id):
data = request.json
result = connect_db.db.product.update_one({"_id": ObjectId(id)}, {"$set": data})
if result.matched_count:
return jsonify({"status": "updated successfully"})
return jsonify({"error": "Item not found"}), 404

@app.route('/items/<id>', methods=['DELETE'])
def delete_item(id):
result = connect_db.db.product.delete_one({"_id": ObjectId(id)})
if result.deleted_count:
return jsonify({"status": "deleted successfully"})
return jsonify({"error": "Item not found"}), 404

if __name__ == "__main__":
app.run(host='0.0.0.0', port=5000)

Paso 3 — Interactuar con la API

Crear un ítem:

curl -X POST http://localhost:5000/items \
-H "Content-Type: application/json" \
-d '{"name": "John Doe", "age": 30, "place": "New York"}'

Obtener todos los ítems:

curl -X GET http://localhost:5000/items

Obtener un ítem específico:

curl -X GET http://localhost:5000/items/<id>

Actualizar un ítem específico:

curl -X PUT http://localhost:5000/items/<id> \
-H "Content-Type: application/json" \
-d '{"name": "Jane Doe", "age": 31, "place": "Los Angeles"}'

Eliminar un ítem específico:

curl -X DELETE http://localhost:5000/items/<id>