En este tema, aprenderemos cómo crear endpoints RESTful utilizando Flask. Los endpoints RESTful son puntos de acceso a nuestra API que permiten a los clientes interactuar con nuestro servidor a través de métodos HTTP estándar como GET, POST, PUT y DELETE.

Conceptos Clave

  1. REST (Representational State Transfer): Un estilo de arquitectura para diseñar servicios web que utiliza métodos HTTP y URLs para acceder y manipular recursos.
  2. Endpoints: URLs específicas que representan recursos en nuestra API.
  3. Métodos HTTP: Acciones que se pueden realizar en los recursos (GET, POST, PUT, DELETE).

Paso a Paso para Crear Endpoints RESTful

  1. Configuración Inicial

Antes de comenzar, asegúrate de tener Flask instalado y configurado. Si no lo has hecho, sigue los pasos en el módulo 1 para configurar tu entorno de desarrollo.

  1. Creación de un Proyecto Flask

Primero, crea un nuevo proyecto Flask o abre uno existente. Asegúrate de tener una estructura básica de aplicación Flask.

from flask import Flask, jsonify, request

app = Flask(__name__)

# Datos de ejemplo
todos = [
    {"id": 1, "task": "Learn Flask", "done": False},
    {"id": 2, "task": "Build a REST API", "done": False}
]

# Endpoint para obtener todas las tareas
@app.route('/todos', methods=['GET'])
def get_todos():
    return jsonify(todos)

if __name__ == '__main__':
    app.run(debug=True)

  1. Creación de Endpoints Básicos

Obtener Todos los Recursos (GET)

El método GET se utiliza para obtener una lista de recursos o un recurso específico.

@app.route('/todos', methods=['GET'])
def get_todos():
    return jsonify(todos)

Obtener un Recurso Específico (GET)

Para obtener un recurso específico, podemos pasar un parámetro en la URL.

@app.route('/todos/<int:todo_id>', methods=['GET'])
def get_todo(todo_id):
    todo = next((todo for todo in todos if todo["id"] == todo_id), None)
    if todo is None:
        return jsonify({"error": "Todo not found"}), 404
    return jsonify(todo)

Crear un Nuevo Recurso (POST)

El método POST se utiliza para crear un nuevo recurso.

@app.route('/todos', methods=['POST'])
def create_todo():
    new_todo = request.get_json()
    new_todo["id"] = len(todos) + 1
    todos.append(new_todo)
    return jsonify(new_todo), 201

Actualizar un Recurso Existente (PUT)

El método PUT se utiliza para actualizar un recurso existente.

@app.route('/todos/<int:todo_id>', methods=['PUT'])
def update_todo(todo_id):
    todo = next((todo for todo in todos if todo["id"] == todo_id), None)
    if todo is None:
        return jsonify({"error": "Todo not found"}), 404
    data = request.get_json()
    todo.update(data)
    return jsonify(todo)

Eliminar un Recurso (DELETE)

El método DELETE se utiliza para eliminar un recurso.

@app.route('/todos/<int:todo_id>', methods=['DELETE'])
def delete_todo(todo_id):
    global todos
    todos = [todo for todo in todos if todo["id"] != todo_id]
    return '', 204

  1. Ejecución de la Aplicación

Guarda el archivo y ejecuta la aplicación Flask.

python app.py

  1. Prueba de los Endpoints

Puedes utilizar herramientas como Postman o cURL para probar los endpoints que has creado.

Ejemplo de Prueba con cURL

  • Obtener todos los recursos:

    curl -X GET http://127.0.0.1:5000/todos
    
  • Obtener un recurso específico:

    curl -X GET http://127.0.0.1:5000/todos/1
    
  • Crear un nuevo recurso:

    curl -X POST -H "Content-Type: application/json" -d '{"task": "New Task", "done": false}' http://127.0.0.1:5000/todos
    
  • Actualizar un recurso existente:

    curl -X PUT -H "Content-Type: application/json" -d '{"task": "Updated Task", "done": true}' http://127.0.0.1:5000/todos/1
    
  • Eliminar un recurso:

    curl -X DELETE http://127.0.0.1:5000/todos/1
    

Ejercicio Práctico

Ejercicio 1: Crear una API de Notas

  1. Crea una nueva aplicación Flask.
  2. Define una lista de notas con los campos id, title, y content.
  3. Implementa los siguientes endpoints:
    • GET /notes: Obtener todas las notas.
    • GET /notes/<int:note_id>: Obtener una nota específica.
    • POST /notes: Crear una nueva nota.
    • PUT /notes/<int:note_id>: Actualizar una nota existente.
    • DELETE /notes/<int:note_id>: Eliminar una nota.

Solución

from flask import Flask, jsonify, request

app = Flask(__name__)

# Datos de ejemplo
notes = [
    {"id": 1, "title": "First Note", "content": "This is the first note"},
    {"id": 2, "title": "Second Note", "content": "This is the second note"}
]

@app.route('/notes', methods=['GET'])
def get_notes():
    return jsonify(notes)

@app.route('/notes/<int:note_id>', methods=['GET'])
def get_note(note_id):
    note = next((note for note in notes if note["id"] == note_id), None)
    if note is None:
        return jsonify({"error": "Note not found"}), 404
    return jsonify(note)

@app.route('/notes', methods=['POST'])
def create_note():
    new_note = request.get_json()
    new_note["id"] = len(notes) + 1
    notes.append(new_note)
    return jsonify(new_note), 201

@app.route('/notes/<int:note_id>', methods=['PUT'])
def update_note(note_id):
    note = next((note for note in notes if note["id"] == note_id), None)
    if note is None:
        return jsonify({"error": "Note not found"}), 404
    data = request.get_json()
    note.update(data)
    return jsonify(note)

@app.route('/notes/<int:note_id>', methods=['DELETE'])
def delete_note(note_id):
    global notes
    notes = [note for note in notes if note["id"] != note_id]
    return '', 204

if __name__ == '__main__':
    app.run(debug=True)

Conclusión

En esta sección, hemos aprendido cómo crear endpoints RESTful utilizando Flask. Hemos cubierto los métodos HTTP básicos y cómo implementarlos en nuestra API. En el próximo módulo, exploraremos cómo manejar datos JSON y autenticación para nuestras APIs.

Curso de Desarrollo Web con Flask

Módulo 1: Introducción a Flask

Módulo 2: Conceptos Básicos de Flask

Módulo 3: Formularios y Entrada de Usuario

Módulo 4: Integración de Bases de Datos

Módulo 5: Autenticación de Usuarios

Módulo 6: Conceptos Avanzados de Flask

Módulo 7: APIs RESTful con Flask

Módulo 8: Despliegue y Producción

Módulo 9: Pruebas y Mejores Prácticas

Módulo 10: Extensiones y Ecosistema de Flask

© Copyright 2024. Todos los derechos reservados