crear entorno virtual

instalar django

django-admin startproject django_crud_api .

cear app

python manage.py startapp tasks
python manage.py migrate

settings

INSTALLED_APPS = [
    ...
    'tasks'
]

Instalando DRF

pip install djangorestframework
pip install django-cors-headers

añade rest_framework y corsheaders en django_crud_api/settings.py

INSTALLED_APPS = [
    ...
    "corsheaders",
    "rest_framework",
    "tasks"
]

Luego en el mismo archivo en middleware

MIDDLEWARE = [ ... 'corsheaders.middleware.CorsMiddleware', ]

Luego en el mismo archivo django_todo_api/settings.py añade al final lo siguiente:

CORS_ORIGIN_WHITELIST = ['http://localhost:3000']

django-cors-headers es una biblioteca de Python que evitará los errores que normalmente obtendría debido a las reglas CORS. En el código CORS_ORIGIN_WHITELIST, incluiste http en la lista blanca: http://localhost:3000 porque desea que la interfaz (que se servirá en ese puerto) de la aplicación interactúe con la API.

Crear Modelo de Tareas

en tasks/models.py

from django.db import models

# Create your models here.
class Task(models.Model):
    title = models.CharField(max_length=200)
    description = models.TextField(blank=True)
    done = models.BooleanField(default=False)

    def __str__(self):
        return self.title
python manage.py createsuper
python manage.py makemigrations tasks
python manage.py migrate tasks

Serializar el Modelo Usuario

Necesitará serializadores para convertir instancias de modelo a JSON para que la interfaz pueda funcionar con los datos recibidos.

en tasks/serializer.py

from rest_framework import serializers
from .models import Task

class TaskSerializer(serializers.ModelSerializer):
    class Meta:
        model = Task
        # fields = ('id', 'title', 'description', 'done')
        fields = '__all__'

este modelo convertira todos los campos a JSON,

Creando la Vista

En el archivo tasks/views.py, vamos a escribir la lógica de la funcionalidad CRUD para nuestra aplicación. Django Rest framework viene con clases incorporadas que hacen que construir la funcionalidad CRUD sea muy fácil.

from rest_framework import viewsets
from .serializer import TaskSerializer
from .models import Task

# Create your views here.
class TaskView(viewsets.ModelViewSet):
    serializer_class = TaskSerializer
    queryset = Task.objects.all()

The viewsets base class provides the implementation for CRUD operations by default.

One step further is the ModelViewSet, which is an extension of the viewsets for when you are working with Django models. Just specifying a serializer_class and a queryset you have all the CRUD operations of the viewsets ready to go.

A viewset that provides default methods for CRUD operations that can be mapped as below:

ENDPOINT METHOD ACTION DESCRIPTION
todo/api/v1/tasks GET list() Get all tasks
todo/api/v1/tasks POST create() Create new task
todo/api/v1/tasks/:id GET retrive() Get task details
todo/api/v1/tasks/:id PUT update() Update task
todo/api/v1/tasks/:id DELETE delete() Delete task

CReando url para el ENDPOINT

Hay varias formas de configurar direcciones URL para conjuntos de vistas. Podemos escribir urls individuales para cada operación. Pero lo haremos de manera más inteligente usando routers.

routers generar automáticamente patrones de URL y rutas para acciones de estilo CRUD (crear/recuperar/actualizar/destruir). Ya no tenemos que lidiar con el cableado de la URL conf nosotros mismos.

Cree un archivo tasks/urls.py con su editor de código. Abra el archivo urls.py y agregue el contenido con las siguientes líneas de código:

from django.urls import include, path
from rest_framework import routers
from tasks import views

router = routers.DefaultRouter()
router.register(r"tasks", views.TaskView, "tasks")

urlpatterns = [
    path("api/v1/", include(router.urls)),
]

luego en django_crud_api/urls.py:

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path("admin/", admin.site.urls),
    path('todo/', include('tasks.urls')),
]

Probando API

python manage.py runserver

GET http://localhost:8000/task/api/v1/tasks
GET http://localhost:8000/task/api/v1/tasks/1

tambien puedes hacer peticiones POST, PUT o DELETE.

Documentando

Usaremos coreapi para documentar nuestros puntos finales, instale coreapi en nuestro entorno:

pip install coreapi

en django_crud_api/settings.py

INSTALLED_APPS = [
    ...
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'corsheaders',
    'rest_framework',
    'coreapi',
    'tasks',
]

añade esto al final de settings.py

REST_FRAMEWORK = {
    'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema'
}

finalmente en tasks/urls.py

from django.urls import include, path from rest_framework import routers from rest_framework.documentation import include_docs_urls from tasks import views

router = routers.DefaultRouter() router.register(r"tasks", views.TaskView, "tasks")

urlpatterns = [ ... path('docs/', include_docs_urls(title='Todo API')), ]

Al navegar a http://localhost:8000/todo/docs/ en el navegador, podremos ver la documentación completa de nuestros puntos finales de la API Todo CRUD.

Más recursos