LogoEjk

TEST

Introduciento Django REST Framework

March 27, 2016

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.

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.

Return to blog