Saltar a contenido

Project dj prods api

0 Preparando Entorno

Creamos y activamos nuestro entorno virtual dj-prods-api.

virtualenv dj-prods-api

cd dj-prods-api
source bin/activate

| Es probable que necesitemos crear un enlace simbolico de python3 en .bashrc

sudo ln -s /usr/bin/python3 /usr/bin/python

1 Paquetes Necesarios

Instalamos los paquetes necesesarios.

pip install django
pip install djangorestframework

OPTIONALS For GH ** and HK**

Enlistar requirements de nuestro entorno variable en un txt. para luego poderlo exportar.

pip freeze > requirements.txt

Iniciar y subir repositiorio para tener control sobre nuestro codigo y sus cambios.

git init && git add . && gh repo create  && git commit -m "start and conect project"  && git push -u origin master && git config --get remote.origin.url

o con lift - gbash:

git start

2 Crando Proyecto y App DJango

1 Creamos un proyecto DJANGO nuevo:

django-admin startproject DJprodsApi

2 Ingresamos al cd /DJprodsApi y creamos una aplicacion apirest:

./manage.py startapp apirest

3 Configs SQLite

1 migramos los datos a nuestra BD por defecto SQLite:

./manage.py migrate

2 Creando Super User para el ADMIN:

./manage.py createsuperuser

3 Testeamos el funcionamiento de nuestro proyecto:

./manage.py runserver
LAN:
./manage.py runserver 0.0.0.0:8000

| Para Server on LAN podemos o usar ngk necesitamos habilitar los hosts en JprodsApi/DJprodsApi/settings.py

ALLOWED_HOSTS = ['*']

4 Registrar Aplicacion

1 Nos dirigimos a JprodsApi/DJprodsApi/settings.py y agregamos a

INSTALLED_APPS = [
    #... 
    #Estos dos valores:
    'rest_framework',
    'apirest'
]

5 Creando MODELO

1 Nos hubicamos en JprodsApi/apirest/models.py no hay ningun modelo asi que agregamos una clase asi y tendriamos nuestro primer modelo.

class Producto(models.Model):
        ##Atributos
    class Meta:
        verbose_name = ("Producto")
        verbose_name_plural = ("Productos")

    def __str__(self):
        return self.name #name Cambia segun Atributo queramos regresar

2 Agregamos ##Atributos a nuestro modelo.

class Producto(models.Model):

    nombres=models.CharField(max_length=50)
    marca=models.CharField(max_length=50)
    codigo=models.CharField(max_length=8)
    emailemp=models.EmailField(max_length=50)
    created=models.DateTimeField(auto_now_add=True)
    updated=models.DateTimeField(auto_now=True)

    class Meta:
        verbose_name = ("Producto")
        verbose_name_plural = ("Productos")

    def __str__(self):
        return self.nombres

3 Ahora empaquetamos nuestra migracion con:

./manage.py makemigrations

4 Ahora si migramos nuestras nuevas makemigrations:

./manage.py migrate

5 Registramos nuestro modelo en JprodsApi/apirest/admin.py

from django.contrib import admin
from .models import Producto

admin.site.register(Producto, ProductoAdmin) #Quita ProductoAdmin si no funciona
Deberiamos de ver productos en nuestro admin al correr nuestro servidor.

6 ADMIN Config

1 Para esta config debemos agregar este codigo en nuestro JprodsApi/apirest/admin.py.

from django.contrib import admin
from .models import Producto

#ADMING Config - para mostrar atributos de nuestros productos en el admin.
class ProductoAdmin(admin.ModelAdmin):
    list_display = ('nombres', 'marca', 'codigo','emailemp')

admin.site.register(Producto, ProductoAdmin)

7 Serializers

1 Creamos un nuevo archivo con el nombre de serializers.py dentro de JprodsApi/apirest/ y agregamos este codigo.

from rest_framework import serializers
from .models import Producto

class ProductoSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model=Producto
        fields = ('id', 'nombres', 'marca', 'codigo','emailemp')

8 Vistas

1 Ahora editamos JprodsApi/apirest/views.py. y agregamos.

from rest_framework import viewsets
from .serializers import ProductoSerializer
from .models import Producto

class ProductoViewSet (viewsets.ModelViewSet):
    queryset=Producto.objects.all()
    serializer_class = ProductoSerializer

9 URLS o Rutas

1 Ahora editamos JprodsApi/JprodsApi/urls.py. y agregamos.

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

# urls
from django.urls.conf import include
from rest_framework import routers
from apirest import views

router=routers.DefaultRouter()
router.register('productos', views.ProductoViewSet)
# urls ##


urlpatterns = [
    path('admin/', admin.site.urls),
    # urls
    path('api/', include(router.urls)) # urls ##
]

10 DRF Permisos De Escritura y Paginate

Permisos de escritura 1 Agregamos el siguiente codigo al final de JprodsApi/DJprodsApi/settings.py:

# Esto hace que se limite el acceso segun lo configuremos
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
## Habilitar para restringir escritura
'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly', 
## Habilitar para todos los permisos
#'rest_framework.permissions.AllowAny',
],

## Activar estas dos para la paginate
#'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
#'PAGE_SIZE': 10
}
Y listo esto hará que ya no cualquiera con el enlace del api pueda enviar o modificar nuestros datos.

11 CRUD VISTAS BASADAS EN CLASES

1 Vamos a crear una nueva aplicación llamada productos

./manage.py startapp productos

2 Registramos nuestra nueva app en settings.py del proyecto y deberia verse asi.

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'apirest',
    'productos' #Nueva app
]

3 Dentro de JprodsApi/productos/ crearemos un nuevo archivo llamado urls.py de momento lo dejamos sin nada.

4 Ahora abrimos JprodsApi/productos/views.py y agregamos estas lineas:

from django.views.generic import ListView,DetailView,CreateView,UpdateView,DeleteView
from apirest.models import Producto

class ProductoListView(ListView):
    model = Cliente
    #template_name = ".html"

5 Nos dirigimos a JprodsApi/JprodsApi/urls.py principal y añadimos.

Agregamos esta importación:

from productos.views import ProductoListView ## .5

Y el path de productos:

urlpatterns = [
    path('admin/', admin.site.urls),
    # urls
    path('api/', include(router.urls)), # urls ##
    path('productos',ProductoListView.as_view(template_name="productos/index.html"),name='listar') ## .5
]

6 Ahora creamos dentro de JprodsApi/productos/ Creamos una carpeta nueva llamada templates.

7 Luego dentro de JprodsApi/productos/templates crearemos otra carpeta llamada productos y dentro de esta index.html.

8 Agregamos este codigo a nuestro index.html:

<h1>Productos</h1>
<ul>
{% for producto in object_list %}
    <li>{{ producto.nombres }} - {{ producto.marca }}</li>
{% empty %}
    <li>No articles yet.</li>
{% endfor %}
</ul>

yyy listo hasta aqui ya solo queda continuar con el diseño.

Agregando Atributos a nuestro modelo

1 Nos vamos a JprodsApi/apirest/models.py y agregamos otro atributo, de esta manera es necesario que tenga default="" de lo contrario nos saldrá un error al crear la migración.

precio=models.CharField(max_length=8, default="")

2 Ahora creamos la migración y migramos.

./manage.py makemigrations

./manage.py migrate

3 Esto es adicional para la vista en el admin de nuestro producto, esto añadira a la vista el valor del nuevo atributo, para ello agregamos nuestro atributo en JprodsApi/apirest/admin.py y deberia quedar asi:

from .models import Producto

class ProductoAdmin(admin.ModelAdmin):
                                        #New Atributo
    list_display = ('nombres', 'marca', 'precio', 'codigo','emailemp', 'id')

admin.site.register(Producto, ProductoAdmin)

PERMISOS CORS

CORS HEADERS:

Se produce un error al al tratar de acceder desde Angular, Vue, otros al servicio, cuando se trata de acceder al servicio especialmente cuando trabajamos en localhost font: https://www.stackhawk.com/blog/django-cors-guide/

pip install django-cors-headers

En settings.py

Agregar esto mas

'corsheaders.middleware.CorsMiddleware',
Y las rutas que tendran acceso:

CORS_ALLOWED_ORIGINS = [

"http://localhost:4200",

"http://127.0.0.1:4200"

]