CONSTRUYENDO UNA API REST CON PYTHON Y MONGODB César Suárez Ortega II Jornadas Técnicas UEx – CIEMAT: Introducción a NoSQL con MongoDB 9 – 11 de Febrero, 2016
Petición HTTP Se hace a una URL (http://api.com/foo). Métodos de petición: GET: Obtiene datos. POST: Edita datos PUT: Añade datos DELETE: Borra datos. Cabeceras, cuerpo (JSON), versión, etc.
Respuesta HTTP Cuerpo (JSON) Código de respuesta 200: OK 4XX: Error en la petición. 400: Petición mal formada. 401: Problema en autenticacións. 403: Petición rechazada. 404: Recurso no encontrado. 5XX: Error en servidor (500). Cabeceras, versión, etc.
Python 101 def print_animals(print_it): if print_it == True: for animal in ["dog", "cat", "mouse"]: print "{0} is a mammal".format(animal) Lenguaje interpretado. No usa llaves: Identación. Muy muy legible. No hace falta saberlo para la práctica. https://learnxinyminutes.com/docs/python/
PyMongo 101 # Importamos PyMongo from pymongo import MongoClient # Creamos el cliente client = MongoClient("0.0.0.0", 27017) # Obtenemos una base de datos db = client.shop # Obtenemos una colección collection = db.catalog
Consultando datos II # Obteniendo varios documentos. ¡Devuelve un iterator! cursor = collection.find({}) for doc in cursor: print doc['description'] # Esto es lo mismo for doc in collection.find({}): print doc['description'] # Dot Notation for doc in collection.find({'field1.field2': 'whatever'}): print doc['field1']['field2'] # Filtrando por datos de un array for doc in collection.find({'some_array': 'value'}): print doc['some_array']
Consultando datos III # Ordenando resultados for doc in col.find({}).sort('field'): ... # Ignorando los dos primeros elementos for doc in col.find({}).skip(2): ... # Devolviendo sólo 5 resultados for doc in col.find({}).limit(5): ... # ¡Todo junto! for doc in col.find({}).skip(2).limit(5).sort('field'): ...
Indexes from pymongo import ASCENDING #Creando un index col.create_index([("item_number", ASCENDING)]) #Usando el index for doc in col.find({}).hint(["item_number", ASCENDING]): print doc['description']
Actualizando datos I # Incrementando el valor de un documento col.update_one({"item_number": 5}, {"$inc": {"stock": 20}}) # Incrementando el valor de varios documentos col.update_many({"item_number": 5}, {"$inc": {"stock": 20}}) # Cambiando el valor de un campo col.update_one({"item_number": 5}, {"$set": {"stock": 0}}) # Añadiendo un valor a un array col.update_one({"item_number": 5}, {"$push": {"tag": "sweet"}}) # Borrando un valor de un array col.update_many({}, {"$pull": {"tag": "sweet"}}) # Reemplazando un documento (también hay replace_many) col.replace_one({"stock": 13}, {"stock": 0, "tags": ["cool"]})
Borrando datos # Borrando un elemento col.delete_one({"item_number": 5}) # Borrando muchos elementos col.delete_many({"stock": 0}) # Consulta y borrado atómico doc = col.find_one_and_delete({"item_number": 5})
Gestión del catálogo [GET] /catalog Obtiene todos los productos del catálogo. [GET] /catalog?type= Obtiene todos los productos del catálogo de un tipo. [GET] /catalog/ Obtiene un producto. [PUT] /catalog Añade un producto. [POST] /catalog/ Edita (reemplaza) los datos de un producto. [DELETE] /catalog/ Borra un producto.
Gestión de los carritos I [GET] /cart Obtiene todos los carros. [GET] /cart/ Obtiene un carro. [PUT] /cart Añade un carro. [POST] /cart/ Edita (reemplaza) los datos de un carro. [DELETE] /catalog/ Borra un carro.
Gestión de los carros II [PUT] /cart//product Añade un producto al carros. [DELETE] /cart/ Borra un producto de un carros. BOLA EXTRA [GET] /platform/ Devuelve las consolas disponibles y el número de juegos disponibles.
A tener en cuenta Al añadir un producto a un carro hay que actualizar el stock. Al borrar un producto de un carro hay que actualizar el stock. Al borrar/actualizar un producto hay que borrarlo de los carros. Al añadir/editar algo hay que devolver el objeto añadido/modificado. El código debe ser lo más atómico posible. ¡Usad índices!