Saltar a contenido

Rest FrameWork y Vistas

Primero realizaremos un cambio en las URL

Conectar el mapeador URL - Aplicacion Ventas

El sitio web se crea con un archivo mapeador de URLs (urls.py) en la carpeta del proyecto. Aunque puedes usar este fichero para gestionar todos tus mapeos URL, es más usual deferir los mapeos a su aplicación asociada.

Abre sitealmacen/sitealmacen/urls.py y fíjate en el texto educativo que explica algunas formas de usar el mapeador URL.

En primer lugar en este archivo se debe importar from django.urls import include

Nota: Luego incluir las rutas para cada aplicación (sale, product y client)

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

urlpatterns = [
    path('admin/', admin.site.urls),
    path('sale/', include('myapps.sale.urls')),
    path('product/', include('myapps.product.urls')),
    path('client/', include('myapps.client.urls')),
]

Luego configuramos Urls para cada aplicación

Crear archivo Urls en ventas:

path('sale/', include('myapps.sale.urls')), observe que en esta linea la separación de los puntos \< . >, indica la ruta para llegar al archivo, seria similar Apps/sale/urls la extensión del archivo urls.py se omite.

Este archivo no existe, por cuanto toca crearlo en la ruta correspondiente.

Archivo myapps/sale/urls.py

from django.urls import path

urlpatterns = [

]

Crear archivo Urls en product:

Archivo myapps/products/urls.py

from django.urls import path

urlpatterns = [

]

Crear archivo Urls en clients:

Archivo myapps/client/urls.py

from django.urls import path

urlpatterns = [

]

Probar las Vistas en la aplicación sale (ventas)

Recordemos que Django utiliza el modelo MVT, es decir Modelo - Vista - Template. Es decir Q para visualizar alguna pagina dentro de la aplicación de sale tendríamos que realizarlo en Views. y luego llamarlo desde Urls.

De la siguiente manera:

En myapps/sale/views.py realizamos una función que llamaremos home de la siguiente manera:

from django.shortcuts import render
from django.http import HttpResponse

# Create your views here.


def home(request):     
    return HttpResponse("Bienvenidos, Uniguajira!- Aplicación Ventas")

Luego importamos esta función en la ruta de urls de la aplicación y agregamos la ruta

myapps/sale/urls.py

from django.urls import path
from myapps.sale.views import home

urlpatterns = [
    path('inicio/', home, name= 'home'),
]

Probar las Vistas en la aplicación product (productos)

Recordemos que Django utiliza el modelo MVC, es decir Modelo - Vista - Controlador. Es decir Q para visualizar alguna pagina dentro de la aplicación de productos tendríamos que realizarlo en Views. y luego llamarlo desde Urls.

De la siguiente manera:

En myapps/product/views.py realizamos una función que llamaremos home de la siguiente manera:

from django.shortcuts import render
from django.http import HttpResponse

# Create your views here.


def home(request):     
    return HttpResponse("Bienvenidos, Uniguajira!- Aplicación Productos")

Luego importamos esta función en la ruta de urls de la aplicación y agregamos la ruta

myapps/product/urls.py

from django.urls import path
from myapps.product.views import home

urlpatterns = [
    path('inicio/', home, name= 'home'),
]

Probar las Vistas en la aplicación client (clientes)

Recordemos que Django utiliza el modelo MVC, es decir Modelo - Vista - Controlador. Es decir Q para visualizar alguna pagina dentro de la aplicación de clientes tendríamos que realizarlo en Views. y luego llamarlo desde Urls.

De la siguiente manera:

En myapps/client/views.py realizamos una función que llamaremos home de la siguiente manera:

from django.shortcuts import render
from django.http import HttpResponse

# Create your views here.


def home(request):     
    return HttpResponse("Bienvenidos, Uniguajira!- Aplicación Clientes")

Luego importamos esta función en la ruta de urls de la aplicación y agregamos la ruta

myapps/client/urls.py

from django.urls import path
from myapps.client.views import home

urlpatterns = [
    path('inicio/', home, name= 'home'),
]

Para probar cada una de las vistas, primero indicamos la ruta por defecto de Django: localhost:8000, luego el nombre de acceso a la ruta de la aplicación: ventas, productos o clientes y luego la ruta creamos en la propia aplicación que llamamos: inicio. Como se muestra a continuación:

localhost:8000/ventas/inicio/

localhost:8000/productos/inicio/

localhost:8000/clientes/inicio/

Rest FrameWork

Django REST framework es un conjunto de herramientas potente y flexible para crear API web Instalación

pip install djangorestframework

Añadir 'rest_framework'a su INSTALLED_APPSconfiguración, en el archivo sitealmacen/sitealmacen/settings.py

INSTALLED_APPS = [
    ...
    'rest_framework',
]

Configurar Paquete CORS

Necesitamos permitir solicitudes a nuestra aplicación Django desde otros orígenes.\ En este ejemplo, configuraremos CORS para aceptar solicitudes de localhost:8000.

Primero, instale la biblioteca django-cors-headers :\ pip install django-cors-headers

En settings.py , agregue la configuración para CORS:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'myapps.sale.apps.SaleConfig',
    'myapps.product.apps.ProductConfig',
    'myapps.client.apps.ClientConfig',
    'rest_framework',
    # CORS
    'corsheaders',
]

También debe agregar una clase de middleware para escuchar las respuestas:

MIDDLEWARE = [
    # CORS
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

Nota: CorsMiddleware debe colocarse lo más alto posible, especialmente antes de cualquier middleware que pueda generar respuestas comoCommonMiddleware.

A continuación, configure CORS_ORIGIN_ALLOW_ALL y agregue el host a CORS_ORIGIN_WHITELIST :

CORS_ORIGIN_ALLOW_ALL = True
# CORS_ORIGIN_WHITELIST = (
#     'http://localhost:4200',
# )
  • CORS_ORIGIN_ALLOW_ALL : si True, se aceptarán todos los orígenes (no use la lista blanca a continuación). El valor predeterminado es False.

  • CORS_ORIGIN_WHITELIST : lista de orígenes que están autorizados para realizar solicitudes HTTP entre sitios. El valor predeterminado es [].

Si tiene la intención de utilizar la API

Existen tres maneras de mostrar la información de nuestros modelos

API View

GenericAPIView

ViewSets

Explicaremos las tres formas para que luego ustedes examinen la mejor de acuerdo a las circunstancias, eto lo haremos con cada una de las aplicaciones y modelos

Para aplicar las 3 formas, cambiaremos el Uso de urls y viws para cada tipo y no uno solo como lo habiamos hecho hasta el momento

APLICACION CLIENT

myapps/client/serializers.py

from rest_framework import serializers
from .models import Client

class ClientSerializer(serializers.ModelSerializer):
    class Meta:
        model = Client
        fields = '__all__'

a. ViewSet

myapps/client/views_viewset.py

from rest_framework import viewsets
from .models import Client
from .serializers import ClientSerializer

class ClientViewSet(viewsets.ModelViewSet):
    queryset = Client.objects.all()
    serializer_class = ClientSerializer

myapps/client/urls_viewset.py

from rest_framework.routers import DefaultRouter
from .views_viewset import ClientViewSet

router = DefaultRouter()
router.register(r'clients', ClientViewSet)

urlpatterns = router.urls

Para probar cambiamos la estructura de urls principal

sitealmace/sitealmacen/urls.py

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

urlpatterns = [
    path('admin/', admin.site.urls),
    # path('sale/', include('myapps.sale.urls')),
    # path('product/', include('myapps.product.urls')),
    # path('client/', include('myapps.client.urls')),

    # Para ViewSet:
    path('api/', include('myapps.client.urls_viewset')),
]

Ahora probemos el CRUD

En el navegador

http://127.0.0.1:8000/api/clients/

Podemos ver todos y crear nuevos clientes

En el navegador

http://127.0.0.1:8000/api/clients/

Podemos Actualizar y Eliminiar un cliente

b. Generic

myapps/client/views_generic.py

from rest_framework.generics import ListCreateAPIView, RetrieveUpdateDestroyAPIView
from .models import Client
from .serializers import ClientSerializer

class ClientListCreateGenericAPIView(ListCreateAPIView):
    queryset = Client.objects.all()
    serializer_class = ClientSerializer

class ClientRetrieveUpdateDestroyGenericAPIView(RetrieveUpdateDestroyAPIView):
    queryset = Client.objects.all()
    serializer_class = ClientSerializer

myapps/client/urls_generic.py

from django.urls import path
from .views_generic import ClientListCreateGenericAPIView, ClientRetrieveUpdateDestroyGenericAPIView

urlpatterns = [
    path('clients/', ClientListCreateGenericAPIView.as_view(), name='client-list-create'),
    path('clients/<int:pk>/', ClientRetrieveUpdateDestroyGenericAPIView.as_view(), name='client-detail'),
]

Para probar cambiamos la estructura de urls principal

sitealmace/sitealmacen/urls.py

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

urlpatterns = [
    path('admin/', admin.site.urls),
    # path('sale/', include('myapps.sale.urls')),
    # path('product/', include('myapps.product.urls')),
    # path('client/', include('myapps.client.urls')),

    # Para ViewSet:
    # path('api/', include('myapps.client.urls_viewset')),

    # Para GenericAPIView:
    path('api/', include('myapps.client.urls_generic')),
]

Ahora probemos el CRUD

En el navegador

http://127.0.0.1:8000/api/clients/  ==> Para Ver los registros de clientes
http://127.0.0.1:8000/api/clients/1   ==> Para actualizar y eliminar los registros de clientes

c. API View

myapps/client/views_apiview.py

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .models import Client
from .serializers import ClientSerializer



class ClientListCreateAPIView(APIView):

    def get(self, request):
        clients = Client.objects.all()
        serializer = ClientSerializer(clients, many=True)
        return Response(serializer.data)

    def post(self, request):
        serializer = ClientSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

class ClientRetrieveUpdateDestroyAPIView(APIView):
    def get_object(self, pk):
        try:
            return Client.objects.get(pk=pk)
        except Client.DoesNotExist:
            return None

    def get(self, request, pk):
        client = self.get_object(pk)
        if not client:
            return Response(status=status.HTTP_404_NOT_FOUND)
        serializer = ClientSerializer(client)
        return Response(serializer.data)

    def put(self, request, pk):
        client = self.get_object(pk)
        if not client:
            return Response(status=status.HTTP_404_NOT_FOUND)
        serializer = ClientSerializer(client, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    def delete(self, request, pk):
        client = self.get_object(pk)
        if not client:
            return Response(status=status.HTTP_404_NOT_FOUND)
        client.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

myapps/client/urls_viewset.py

from rest_framework.routers import DefaultRouter
from .views_viewset import ClientViewSet

router = DefaultRouter()
router.register(r'clients', ClientViewSet)

urlpatterns = router.urls

Para probar cambiamos la estructura de urls principal

sitealmace/sitealmacen/urls.py

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

urlpatterns = [
    path('admin/', admin.site.urls),
    # path('sale/', include('myapps.sale.urls')),
    # path('product/', include('myapps.product.urls')),
    # path('client/', include('myapps.client.urls')),

    # Para ViewSet:
    # path('api/', include('myapps.client.urls_viewset')),

    # Para GenericAPIView:
    # path('api/', include('myapps.client.urls_generic')),

    # Para APIView:
    path('api/', include('myapps.client.urls_apiview')),
]

Ahora probemos el CRUD

En el navegador

http://127.0.0.1:8000/api/clients/  ==> Para Ver los registros de clientes http://127.0.0.1:8000/api/clients/1   ==> Para actualizar y eliminar los registros de clientes

ENVIAR Y PROBAR SOLICITUDES DIRECTAMENTE DESDE VS CODE CON REST CLIENT

Se tiene que instalar la extension en visual studio REST CLIENT

Luego crear archivo de peticiones

myapps/client/http/client.http

// client.http

@baseUrl = http://localhost:8000

### Obtener todos los clientes 
GET {{baseUrl}}/api/clients/

### Obtener cliente por ID 
GET {{baseUrl}}/api/clients/5/

### Crear un nuevo cliente
POST {{baseUrl}}/api/clients/
Content-Type: application/json

{
  "name": "María García",
  "address": "Calle 123",
  "phone": "3009876543",
  "email": "maria.garcia23@example.com",
  "password": "87654321",
  "status": "ACTIVE"
}

### Actualizar un cliente completamente (PUT)
PUT {{baseUrl}}/api/clients/5/
Content-Type: application/json

{
  "name": "María García Actualizada",
  "address": "Calle 456 Nueva Dirección",
  "phone": "3001234567",
  "email": "maria.garcia.nueva@example.com",
  "password": "nuevapassword123",
  "status": "ACTIVE"
}

### Eliminar un cliente físicamente
DELETE {{baseUrl}}/api/clients/5/



### Actualizar solo algunos campos (requiere implementar PATCH)
# PATCH {{baseUrl}}/api/clients/2
# Content-Type: application/json
# 
# {
#   "status": "INACTIVE"
# }