Cómo crear un servicio REST en 30 líneas de código de Django y Python

Autor: | Última modificación: 23 de noviembre de 2022 | Tiempo de Lectura: 5 minutos
Temas en este post:

Diseñado para tener una sintaxis clara y concisa, Python es un lenguaje que permite a los desarrolladores adoptar varios estilos: programación orientada a objetos, programación imperativa y programación funcional. Su demanda ha aumentado exponencialmente en estos momentos: desde el desarrollo web con Django hasta la industria financiera y el Big Data.

Django es para perfeccionistas con los pies en el suelo. Pone énfasis en el re-uso, la conectividad y extensibilidad de componentes y el desarrollo veloz. ¿Suena bien, cierto? Pues hoy Alberto Casero, experto en software inteligente e Instructor de KeepCoding, demuestra con pocas líneas de código el gran poder de este framework.

Creando un API Rest para gestionar archivos con tan sólo 33 líneas de código

Al igual que Django y el Dr.Schultz hacen una perfecta pareja de cazarrecompensas en la película de Tarantino, Django y REST Framework son una pareja perfecta para los desarrolladores de backend. Si hay algo que valoro de Django, además de su integrados sistema de usuarios y grupos y web de administración, es lo bien pensado que está. Por suerte su filosofía se extiende entre los desarrolladores, como es el caso del excelente REST Framework.

Gracias a la mezcla de ambos, podemos hacer cosas increíbles con muy pocas líneas de código y hoy vamos a demostrarlo con 33 líneas contando imports, comentarios y líneas en blanco para que el código sea legible. Sí, en el título del post dice 30 líneas ¡pero redondeamos a la baja, que hay líneas en blanco!

trabajando con django_servicio REST en 30 líneas de código

Lo primero que necesitamos, es instalar Django y REST Framework en nuestro sistema para poder empezar a trabajar. Para ello usamos pip (gestor de paquetes de Python) desde nuestra consola:

codigoUna vez instaladas nuestras armas, vamos a crear un projecto Django:

django3Esto nos creará una carpeta files_ manager en cuyo interior tendrá otra carpeta files_ manager con archivos py que actúan como archivos de configuración del proyecto. La filosofía de Django es DRY (Don’t Repeat Yourself), así que el propio framework nos obliga a crear aplicaciones para que podamos reutilizarlas. Así que en nuestro proyecto files_ manager vamos a crear una aplicación llamada files.

Para ello, accedemos a la carpeta del proyecto y creamos nuestra aplicación:

django4Esto nos creará una carpeta files con archivos py de nuestra aplicación. Como otros tantos frameworks, Django usa el patrón MVC (aunque un poco de aquella manera: los controladores los escribimos en un archivo views.py). Vamos a dejarnos ya de tanta consola y a tirar algo de código. Abrimos el archivo models.py de la carpeta files y escribimos lo siguiente:

django5Lo que hemos hecho es crear un modelo File que tiene tres campos:

  • file: que almacenará la ruta al archivo que subamos.
  • created_ on: campo que almacenará la hora de creación del archivo.
  • modified_ on: campo que almacenará la hora de última modificación del archivo.

Bien, sin tener que escribir nada más, Django se encargará pon nosotros de:

  • Gestionar si la carpeta donde vayamos a subir los archivos existe o no (de no existir la creará).
  • Controlar si ya existe un archivo con el mismo nombre que el archivo que subimos para renombrarlo.
  • Asignar una fecha de creación del archivo automáticamente.
  • Asignar una fecha de modificación del archivo cada vez se modifique (también de manera automática).

Lo siguiente que tenemos que hacer es crear un serializador, el cual se encargará de actuar como traductor entre nuestro modelo y los datos que nos envíen a través de las peticiones HTTP de nuestro API Rest.

Creamos un archivo serializers.py en la carpeta files con el siguiente contenido:

django6De nuevo, con tan sólo darle un poco de información a la clase que creamos es suficiente: le decimos de dónde debe sacar la información (queryset) y qué debe de utilizar como traductor (serializer_class). Del resto se encargan Django y REST Framework. Bien, casi hemos llegado al final.

Ahora tenemos que conectar de algún modo este ViewSet con las URLs del API Rest que hablábamos antes. Para ello, utilizaremos un Router. Abrimos el archivo urls.py esta vez de la carpeta files_manager añadimos 5 líneas:

django7Importamos nuestro FileViewSet y el SimpleRouter (líneas 2 y 3):

django8Registramos el FileViewSet en el router (líneas 7 y 8):

django9Y añadimos las URLs que el router genera por nosotros a los patrones de URL de nuestro proyecto (línea 12):

django10Bien, penúltimo paso: registrar nuestra aplicación y REST Framework en el proyecto. Para ello en el archivo settings.py de la carpeta files_ manager añadimos la siguiente línea a la tupla INSTALLED_ APPS:

django11Bien, este es todo el código que necesitamos. Ahora vamos a probarlo. Primero tenemos que crear los archivos de migración para posteriormente crear nuestro esquema de base de datos (por defecto, Django utiliza SQLite salvo que le indiquemos lo contraro, ideal para desarrollar sin tener que instalar software adicional). Volvemos a nuestra consola y ejecutamos:

django12Esto creará un archivo 0001_ initial.py en la carpeta migrations de nuestra carpetafiles. Estas migraciones se crean cada vez que hay un cambio en los modelos (cambios en estructuras de tablas SQL) o cuando los creamos por primera vez. Django hace esto para evitar el tener que andar con scripts SQL de migración. Con los scripts de migración creados, tenemos que aplicar la migración:

django13Muy bien, ya estamos listos para probar nuestro API. Vamos a arrancar el servidor HTTP de desarrollo integrado en Django desde la consola:

django14Si ahora abrimos en nuestro navegador la URL: http://127.0.0.1:8000/files/ deberíamos ver el API navegable funcionando.

¿API navegable?

Sí, REST Framework proporciona un API navegable que nos permite probar rápidamente nuestros APIs ¡sin necesidad de utilizar clientes REST! Para probar la subida de archivos con un cliente REST, deberemos poner la cabecera Content-Type: multipart/form-datapara el envío de la petición POST (porque los archivos no se suben en JSON!). Como veis, con muy poco esfuerzo hemos creado algo muy potente. Pero, ¿y si os decimos que con unas 5 líneas de código extra podemos incluir lo siguiente?

  • Control de autenticación para que los usuarios puedan usar el API sólo si están autenticados (+1 línea).
  • Asignar la autoría de la creación de archivos a un usuario del sistema a la aplicación integrada en Django para gestión de usuarios y grupos (+3 líneas).
  • Hacer visibles los archivos en el administrador web de Django (+1 línea). Sí, Django nos proporciona también un backend de administración web sin apenas esfuerzo.

Como veis, Django es un framework pensado para hacer la vida más fácil a los desarrolladores web, proporcionando herramientas que nos permiten olvidarnos del desarrollo repetitivo y centrarnos en desarrollar únicamente nuestra lógica de negocio. Al igual que en la película de Tarantino Django no desaprovecha las balas, en este caso, Django no desaprovecha las líneas de código.

django15

Y recordad: la D es muda

Ya sea para crear backends o web apps completas, Django y Python son como Django y Dr. King Shultz: ¡una pareja indetenible! Descubre más posibilidades y domina esta tecnología con el KeepConding Startup Engineering Master Bootcamp.