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
./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
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
}
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"
]