Hace poco vi en uno de los blogs que leo un muy interesante artículo acerca de cómo hacer una API REST en una hora, pero ¿Por qué no hacer una en 15 minutos? Para esto vamos a usar python, dajngo y dajngo-rest-framework.
En un artículo pasado habíamos hablado de virtualenv y pip, en este caso usaremos virtualenvwrapper para crear un nuevo entorno y pip para instalar lo necesario:
mkvirtualenv entorno_rest --no-site-packages workon entorno_rest pip install django djangorestframework django-admin.py startproject test_rest cd test_rest django-admin.py startapp apprest
Hora de codificar
Primero que todo es necesario configurar las preferencias del proyecto, es decir, editar el archivo settings dentro de la carpeta test_rest
En éste archivo es necesario incluir en las aplicaciones instaladas nuestra aplicación rest y el framework así:
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework', 'apprest', )Además de esto si quieren que la aplicación solicite usuario y contraseña (mediante Basic Auth) agregamos al archivo:
REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated', ), 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.BasicAuthentication', ), }
Muy bien, luego creamos los modelos de nuestra aplicación, para ello editamos el archivo models.py de la carpeta apprest y definimos lo necesario, yo solo voy a definir dos modelos, pero podrían ser cuantos quisieran:
class Autor(models.Model): nombre = models.TextField(max_length=100) apellido = models.TextField(max_length=100) class Libro(models.Model): nombre = models.TextField(max_length=100) editorial = models.TextField(max_length=100) genero = models.TextField(max_length=100) autor = models.ForeignKey(Autor)Ahora bien, es necesario crear 3 elementos auxiliares, serializadores, que convierten los datos recuperados de la base de datos en json, viewsets, que son los elementos que de acuerdo al tipo de petición renderizan los datos y un router, el cual se encarga de indicar al proyecto django cuáles son las URLs de nuestra API. El serializer se creará en un nuevo archivo que está destinado para todos los serializers, estará dentro de apprest y se llamará serializers.py, veamos:
from rest_framework import serializers from .models import Libro, Autor class LibroSerializer(serializers.ModelSerializer): class Meta: model = Libro fields = ('id', 'nombre', 'editorial', 'genero', 'autor',) class AutorSerializer(serializers.ModelSerializer): class Meta: model = Autor fields = ('id', 'nombre', 'apellido',)Ahora es necesario definir los viewsets, esto se hace en un archivo llamado viewsets.py, que esta ubicado en apprest. A continuación su contenido:
from .models import Libro, Autor from .serializers import LibroSerializer, AutorSerializer from rest_framework import viewsets class LibroViewSet(viewsets.ModelViewSet): serializer_class = LibroSerializer queryset = Libro.objects.all() class AutorViewSet(viewsets.ModelViewSet): serializer_class = AutorSerializer queryset = Autor.objects.all()Finalmente es necesario crear el router y enlazarlo a nuestro proyecto, en esta oportunidad lo haremos directamente en el archivo urls.py del proyecto, ubicado en test_rest, en este definiremos un router, el cual tendrá referencias a los elementos creados anteriormente. Esto se hará así:
from apprest.viewsets import LibroViewSet, AutorViewSet from rest_framework.routers import DefaultRouter router = DefaultRouter() router.register(r'libros', LibroViewSet) router.register(r'autores', AutorViewSet)y en la tupla urlpatterns agregamos:
... url(r'^', include(router.urls)), url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')), ...para obtener finalmente algo así:
from django.conf.urls import patterns, include, url from django.contrib import admin admin.autodiscover() from apprest.viewsets import LibroViewSet, AutorViewSet from rest_framework.routers import DefaultRouter router = DefaultRouter() router.register(r'libros', LibroViewSet) router.register(r'autores', AutorViewSet) urlpatterns = patterns('', # Examples: # url(r'^$', 'test_rest.views.home', name='home'), # url(r'^blog/', include('blog.urls')), url(r'^', include(router.urls)), url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')), url(r'^admin/', include(admin.site.urls)), )para obtener finalmente:
Pueden encontrar el código fuente en github, espero que les sirva de ayuda.
Si te gusto el post
compartelo... :D
Hola esta muy interesante este tutorial, prro te pregunto una vez que ya tienes todo listo como haces que por via ajax te puedas logear en django (es para usarlo desde una app mobile)
ResponderEliminar