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
Crear archivo Urls en product:
Archivo myapps/products/urls.py
Crear archivo Urls en clients:
Archivo myapps/client/urls.py
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/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
Añadir 'rest_framework'a su INSTALLED_APPSconfiguración, en el archivo sitealmacen/sitealmacen/settings.py
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 : si
True, se aceptarán todos los orígenes (no use la lista blanca a continuación). El valor predeterminado esFalse. -
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

Podemos ver todos y crear nuevos clientes
En el navegador

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"
# }