Introduciento Django REST Framework

Estándar

En las cuatro últimas entradas, hemos tomado contacto con el funcionamiento básico de Django. Queremos usarlo para crear una fuente de datos que responda a peticiones básicas. Ya hemos visto como conseguir las respuestas en formato HTML; y dado que HTML es un formato estructurado, podemos considerar que ya hemos cumplido esta misión, más o menos. Pero para servir datos, un formato más apropiado es JSON. En esta entrada, conoceremos el Django REST framework, una plataforma que se encarga de ayudar en la creación de aplicaciones REST, como la que estamos buscando.

De hecho, podríamos implementar la funcionalidad que buscamos cambiando las plantillas HTML por JSON. El sistema resultante sería bastante simple, pero no tendríamos la flexibilidad y seguridad frente a bugs que nos ofrece una plataforma bien asentada. Vamos a reimplementar nuestra aplicación de búsqueda de citas de los Simpson.

La plataforma Django Rest framework se centra en el concepto de serialización, es decir, una representación de los objetos de forma que puedan ser guardados en un ficheo o transmitido por una conexión de red sin pérdida de información o funcionalidad. En nuestro caso, traduciremos los objetos de la base de datos Django a cadenas JSON. La plataforma REST framework proporciona serializadores, clases que definen cómo debe serializarse un modelo concreto, y vistas basadas en clases, que sustituyen las vistas clásicas de Django y simplifican las aplicaciones REST.

El primer paso será instalar el entorno con pip install djangorestframework. A continuación, debemos añadirlo a nuestro proyecto como una aplicación más, por lo que editamos el fichero SQProject/settings.py, y en la sección INSTALLED_APPS añadimos lo siguiente:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'SQapp',
    'rest_framework',
]

el próximo paso será definir un serializador para nuestro modelo CitaSimpsons. Para ello, creamos un fichero nuevo SQapp/serializers.py con los siguientes contenidos:

from rest_framework import serializers
from SQapp.models import CitaSimpsons

class SerializadorCS(serializers.ModelSerializer):
	class Meta:
		model = CitaSimpsons

Esta es la forma más simple de serializador; simplemente usa la clase ModelSerializer, que copia cada campo del modelo configurado en su clase Meta. Hay muchas opciones disponibles para la creación del serializador, pero no las cubriremos aquí.

Después, creamos la clase vista en SQapp/views.py. Para ello, añadimos las siguientes líneas a las ya existentes en el fichero:

from rest_framework.views import APIView
from rest_framework.response import Response
from SQapp.serializers import SerializadorCS

class ClaseBusqueda(APIView):
	def get(self, request):
		# Primera petición
		return render(request, 'buscar.html')

	def post(self, request):
		# Segunda petición
		palabras = request.POST['palabras'].split()
		if len(palabras) >= 1:
			resultados = CitaSimpsons.objects.filter(frase__icontains = palabras[0])
			for palabra_adicional in palabras[1:]: # Filtrar por palabras adicionales
				resultados = resultados.filter(frase__icontains = palabra_adicional)
			if len(resultados) > 0:
				serializador = SerializadorCS(resultados, many=True)
				return Response(serializador.data)
			else:
				return Response({'mensaje':'No hay resultados'})
		else:
			return Response({'mensaje':'Por favor, introduce términos de búsqueda'})

Hagamos un análisis breve de este código. Tenemos una nueva clase ClaseBusqueda que hereda de APIView en la que definimos dos métodos: get(), que procesa las peticiones GET y post(), que procesa las peticiones POST. No cambiamos nada del procesado de las peticiones GET por ahora. Lo único que cambiamos es lo que devuelve la vista al procesar las peticiones POST; usamos un objeto Response que iniciamos con los contenidos de la respuesta. En el caso de los resultados, creamos un serializador que contiene uno o más resultados y devolvemos sus datos al cliente. Para los mensajes de error, usamos un diccionario. Para terminar, debemos cambiar las URL para que apunten a nuestra clase. Para ello modificamos el fichero SQproject/urls.py:

from django.conf.urls import url
from django.contrib import admin
from HWapp.views import citaAleatoria, buscarCita, ClaseBusqueda

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^cita/', citaAleatoria),
    url(r'^buscar/', ClaseBusqueda.as_view()),
]

Necesitamos actualizar el proyecto ejecutando python manage.py migrate, y a continuación podremos ejecutar el servidor y probar la aplicación. Nos encontraremos con que la página de resultados cambia mucho, mostrando un entorno en el que veremos la cadena JSON con los resultados de la búsqueda. Esto significa que hemos conseguido la funcionalidad básica; pero faltan un par de pasos.

Recordemos que nuestro objetivo es conseguir una aplicación REST, que sirve datos a cualquier aplicación que use ese protocolo. En este escenario, un formulario de búsqueda no tiene mucho sentido. Debemos eliminar (o al menos ignorar) ese formulario. Será un poco más complicado probar la aplicación, ya que necesitaremos usar una herramienta como cURL. Seguiremos necesitando iniciar el protocolo con una petición GET, para conseguir un cookie para el middleware CSRF en la respuesta, y en el futuro, para añadir la función de identificación de usuario. Para probar la aplicación, usaremos cURL con los siguientes parámetros:

curl -c cookies.txt localhost:8000/buscar/

Esto guardará los cookies necesarios, entre otros, un código CSRF que necesitaremos extraer. Una vez hecho esto, construiremos nuestra petición POST:

curl -b cookies.txt -d "palabras=<terminos de busqueda>&csrfmiddlewaretoken=<codigo CSRF>" localhost:8000/buscar/

Esto nos devolverá una cadena JSON que contiene los resultados de nuestra búsqueda. Queda mucho por limpiar en este código (por ejemplo, eliminar el formulario de búsqueda inicial), pero ya podemos usar esto en un programa escrito en cualquier lenguaje. Resumiendo, hemos creado una API online para buscar frases de los Simpson. Mejoraremos esto en el futuro.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *