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.
-
Instalar el paquete
python3-venv
sudo apt install -y python3-venv
-
Crear y activar el entorno virtual
mkdir ~/myproject
cd ~/myproject
python3 -m venv myprojectenv
source myprojectenv/bin/activate -
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>