Django Rest Framework

Logo HTML5

Última edición el día 2020-12-14 a las 20:52.

Esta es la documentación que he recopilado para trabajar con Django, un framework basado en Python que sirve para desarrollar aplicaciones web.

Primeros Pasos

Crear un proyecto Django

  • Lo primero que vamos a hacer es crear un entorno virtual.

  • Luego instalamos Django pip install django

  • Creamos un projecto en Django django-admin startproject prueba_api

  • Ejecutamos el servidor para ver que se ha creado correctamente python manage.py runserver

Instalar y configurar Django Rest Framework

Empezamos instalando las librerías necesarias:

  • Instalamos Django Rest Framework pip install djangorestframework

  • Instalamos Django-filter pip install django-filter

  • Y por último, instalamos Markdown: pip install markdown

Pasamos a configurar el proyecto:

  • Lo primero será añadir rest_framework a settings.py:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework'
]
  • Ahora como mínimo necesitamos tener una app creada, para ello ejecutamos python manage.py startapp API

  • Añadimos la app a settings.py:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'API'
]
  • Realizamos la migración de la base de datos python manage.py migrate

  • Y creamos un superusuario python manage.py createsuperuser

Serializadores

Los serializadores se encargan de trabajar con los modelos de datos para adaptarlos a la API.

  • Para comenzar tenemos que crear un modelo en nuestra API (API/models.py):

from django.db import models

class Empleados(models.Model):
    nombre = models.CharField(max_length=100, verbose_name="Nombre")
    apellidos = models.CharField(max_length=100, verbose_name="Apellidos")
    observaciones = models.TextField(verbose_name="Observaciones")

    def _str__(self):
        return self.nombre
  • Ejecutamos python manage.py makemigrations API para preparar las migraciones y migramos la tabla python manage.py migrate API

  • Vamos a crear un archivo para los serializadores en la ruta (API/serializers.py):

# Importamos la librería de serializers:
from rest_framework import serializers
# Importamos el modelo de datos a usar:
from .models import Empleados

# Creamos el serializador:
class EmpleadosSerializer(serializers.ModelSerializer):
class Meta:
    # Elegimos el modelo:
    model = Empleados
    # Podemos elegir los campos a mostrar:
    # fields = ['nombre', 'apellidos', 'observaciones']
    # O mostrar todos los campos:
    fields = '__all__'

Con esto ya hemos preparado el primer serializador.

ViewSets

Los viewsets se implementan en las vistas de Django y sirven para mostrar los valores de la API o bien en su frontend o bien como un JSON, para crear un ViewSet nos vamos a (API/views.py):

from django.shortcuts import render
# Importamos la librería de viewsets:
from rest_framework import viewsets
# El modelo Empleados:
from .models import Empleados
# Y el serializador de Empleados:
from .serializers import EmpleadosSerializer

# Creamos un Viewset para mostrar los datos:
class EmpleadosViewSet(viewsets.ModelViewSet):
    # En el lanzamos un QuerySet al modelo Empleados:
    queryset = Empleados.objects.all()
    # y le decimos que lo serialize con EmpleadosSerializer:
    serializer_class = EmpleadosSerializer

Con esto ya tenemos listo el ViewSet.

Rutas de la API

Para configurar las rutas de la API utilizamos un archivo adicional de rutas o en nuestro caso vamos a usar el archivo principal (prueba_api/urls.py):

from django.contrib import admin
from django.urls import path, include # importamos include
# Importamos la librería routers de rest_frameworks
from rest_framework import routers
# Importamos las vistas de la API
from API import views

# Creamos un enrutador para la API:
router = routers.DefaultRouter()

# En el router vamos añadiendo los endpoints a los viewsets:
router.register('empleados', views.EmpleadosViewSet)

urlpatterns = [
    path('api/v1/', include(router.urls)), # Aquí añadimos la ruta de la api que irá recibiendo los distintos endpoints arriba.
    path('admin/', admin.site.urls),
]

Ahora podemos ejecutar la API en http://localhost:8080/api/v1/ y ver como podemos añadir registros.

Atención

Con el nivel actual de permisos cualquiera puede introducir valores en la API. Para cambiar eso tenemos que ir al apartado de permisos

Permisos

Tenemos varios tipos de permisos para gestionar nusetra API. Para establecer permisos creamos una lista al final de (prueba_api/settings.py):

  • Por defecto nuestra API estará disponible para lectura y escritura de cualquier extraño.

  • Establecer permisos a solo lectura:

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly',
    ],
}
  • Añadir acceso por login para poder editar y ver datos.

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ],
}
  • Login requerido para editar y visualización sin login:

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticatedOrReadOnly',
    ],
}