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.