ApuntesPython Parte1
ApuntesPython Parte1
Aca tenemos un ejemplo de como se realizaba la decoracion, ahora veremos como funciona una clase
decoradora:
el metodo call es como la funcion decoradora que esta dentro de la funcion decorador en la
parte de arriba que esta comentado.
DJANGO
Orientado al BACK-END.
- Modelo-Vista-Template.
ENTORNOS VIRTUALES:
Encapsulaciones/aislamientos de dependencias.
Por ejemplo si estoy trabajando en un poryecto de django 1.10 y me contratan para darle
soporte a una version de django 1.8, entonces si tubiera django de manera global tendria que
desinstalarlo y instalar la version que necesito para darle soporte, entonces este proceso es
tedioso, por ello nace lo de entornos virtuales que esta representada por una carpeta la cual
se le instala las librerias/ paquetes que queramos usar y solo existiran en esta carpeta
siempre y cuando este activado el entorno, si esta desactivado o estamos fuera de esta
carpeta seria como si no existiera.
INSTALACION:
1. Necesito PYTHON, se descarga el instalador desde la pagina oficial.
python –version
2. Instalar Django
La documentacion es muy completa y detallada y ofrece guia inicial para entender como
funciona.
Es bueno tener a la mano la documentacion.
4. Crear entorno virtual para comenzar a trabajar con django, lo primero es que toca
instalar una libreria o dependencia llamada “virtualenv” la cual nos permitira crear
estos entornos.
Pip: es un gestor de paquetes en linux si se una una version 3 de python es pip3.
Para instalar “virtualen” solo colocamos lo siguiente:
en linux seria:
5. lo recomendable es crear una carpeta que diga entornos y poner ahi todos los
entornos.
Para crear el entorno solo colocamos el siguiente comando:
en donde “virtualenv nombre_entorno”
NOTA: virtualenv debe que estar en el path para
que reconosca este comando.
y aparecera el nombre del entorno que se activo, esto indica que el entorno esta
activado.
Las dependencias que estan en el entorno solo estan para el, entonces se instalo
antes virtual env de manera global si hago dentro de mi entorno pip freeze no vere ese
paquete porque dentro de mi entorno (aislado) no tengo esto.
Asi se desactiva.
me situo sobre ella en la terminal y para crear un proyecto (el proyecto que se creara
inicialmente es una biblioteca que usaran para explicar este framework).
el archivo “manage.py” es de los mas importantes que tiene todo proyecto django y el cual
debemos recordar y debemos conocer siempre porque este funciona como intermediario,
porque es a traves de este archivo que vamos a ejecutar comandos propios de django para
crear por ejemplo superUsusriaos..etc.
Ahora si vemos la linea 6 en esta se define las configuraciones que tinene nuestro proyecto y
al nosotros acceder o ejecutar comandos a traves de este archivo le decimos que django
reconosca estas configuraciones y las tome para ejecutar lo que allamos indicado.
Ahora la carpeta que aparece ahi al mismo nivel de manage.py es a la que hace referencia
la linea 6 donde dice “biblioteca.settings”, que es elmodulo de configuracion que tinen django
por defecto, y que si queremos cambiar la configuracion de nuestro poryecto es alli donde lo
debemos cambiar.
• ahora en la linea 23 el
“SECRET_KEY” es unica en
cada proyecto es usada en
produccion y es secreta (ni se
comparta ni borre).
◦ “DEBUG=true” nos indicara los errores que se encuentren como por ejemplo que
no pueda acceder a una pagina o algo. En produccion debe ser false.
◦ “INSTALLED_APPS” : Una
aplicacion es una
abstraccion es decir si yo
tengo un rpc( modulo
contabilidad,
administracion..etc) django
toma el concepto de
aplicacion como cada uno
de estos submodulos que
tienen todo el proyecto
como tal (para separar la
logica (logica de inventario/
logica de administracion), se
pueden comunicar entre si.
Las que muestra ahi ya son
aplicaciones propias que
bienen integradas en django
y que son necesarias para
que funcionen.
Disr: dice los directorios y es alli donde indicaremos todos los templates del proyecto.
app_dirs: en true indica que cuando el cliente haga peticion de un template (archivo html)
django lo buscara automaticamente en todo el proyecto pero incluira la busqueda en las
aplicaciones que mencionamos solo si esta enverdadero, sino esta en verdadero no agregara
esa busqueda.
• Urls.py:
• Wsgi.py:
cuando se este en produccion en este archivo y en manage.py deben tener el mismo archivo
de configuracion o sino no va a funcionar.
Para poder crear una aplicacion hay dos comandos uno es usando el manage.py pero que
no nos ayudara en este caso porque tenemos que estar en la ruta del manage.py y la ruta en
este caso esta en la carpeta apps:
entonces para ello se pueden crear aplicaciones con otro comando que ya hemos usado.
Primero nos dirijimos a la carpeta apps y el comando es “django-admin startapp
nombre_aplicacion”:
Algo que se recomienda es que cada vez que queramos una aplicacion debemos registrarla
en nuestro archivo de configuracion “settings.py”
• admin.py: este es un archivo donde vamos a registrar modelos es decir donde vamos
a registrar modelos es decir tablas para que sean anadidas al administrador que
biene incorporado django.
• Test.py: django trae incluido codigo para hacer pruebas(test) para hacer testeo de
nuestra aplicacion (por ejemplo de nuestros modelos/tablas que esten creados
correctamente y tambien testeo de la logica de programacion que hallamos aplicado
por ejemplo la creacion de un libro si esta bien codificado y no tenemos un error.
• Views.py: aca es donde va a ir la logica y aqui es donde se separa del M-V-C, aqui la
vista no es la parte visual. En este view va a ir la logica de la aplicaion, va atener
reflejada la logica de la creacion de un libro..etc.
MODELO-VISTA-TEMPLATE:
entonces tenemos un usuario el cual va a tener una interaccion con la interfaz/pagina web o
en el sitio creado con django esta va a ser capturada por una URL (es una url que se crea en
el protecto) esta URL va a estar conectada con la vista pero a diferencia del modelo vista
controlador, esta vista lo que va a tener el codigo que va a servir para recibir la interaccion
que el usuario ha hecho y va a tener asociado un modelo ya que a traves de la interaccion y
el codigo de la vista esta indicado si se desa hacer una actualizacion, recuperar datos o
eliminar algo de la base de datos, al estar conectadoi con el modelo el modelo interactua con
la base de datos y esta interaccion al retorno de lo que recibe el modelo se lo va a pasar a la
vista y la vista tendra configurada ademas de que hacer tendra configurada donde lo va a
mostrar, la vista mandara lo que ya recibio del modelo lo va a mandar a un template y en ese
template se define como se va a apreciar todo y en este template es el que le llega al usuario
y que el usuaio ve:
CREACION DE MODELOS:
los modelos es la representacion de las tablas en la base de datos pero estos estan
representados a trabes de sitanxis de python y del framework de python.
Los modelos se vana basar en clases y estas clases van a ser la representacion de las
entidades, tablas de las bases de datos.
En la documentacion de python esta la forma de crear estos modelos:
LINK:
https://docs.djangoproject.com/en/3.2/topics/db/models/
aca se muestra como se crean los diferentes campos que hay para los distintos tipos de
datos que existen y sus equivalencias en sql (lo que escribimos en python como seria en sql).
Ahi tiene las opciones y como se componen (todo esta en la documentacion).
----------------------------------------------------------------------------------------------------------------------------
Ahora vamos al archivo de settings.py y ahi se hara lo siguiente como ya se tiene
configurado sqlite3 y la idea es entender django y no lo de base de datos. Se puede usar
esta base de datos y no se neceita configurar nada.
----------------------------------------------------------------------------------------------------------------------------
Entonces ahora nos vamos al archivo models.py de nuestra aplicacion ya que es aqui donde
se debe escribir los modelos de nuestra aplicacion entonces el primer modelo que se creara
es el autor, haciendo referencia a los autores que tienen los libros, entonces el autor es una
tabla, entonces este heredara “models.Model” ya que es este archivo el que tiene la
identificacion, una clase que hereda de esta va a ser tomada por django como una tabla
(para su posterior migracion a la base de datos).
Entonces por ejemplo si quiero una llave primaria autoincremental puedo ponerle por
ejemplo: models.
“models.” es donde se
encontraran los distintos
tipos de datos.
De esta forma ya tendriamos nuestro campo autoincremental y seria nuestra llave primaria.
Ahora querems poderle un tipo, descripcion, nacionalidad.
Ahora despues de creado mi modelo la idea es que el modelo se cree en la base de datos,
para crear esto en la base de datos debemos ejecutar dos comandos estos comandos:
• el primero lo que hara es crearnos un archivo identificando los modelos que existen en
todo proyecto y dejando una estrucutra que va a ser convertida posteriormente cuando
ejecutemos el otro comando en codigo SQL y representado y aplicado en la base de
datos “python manage.py makemigrations”
entonces aca no solo creara la clase autor, porque django trae consigo ya preparado
varios modelos uno de ellos es el modelo usuario y es porque django ya tiene
preparado una jerarquia de usuarios ademas nos trae tablas con los permisos que
pueden tener estos usuarios; Y tambien se tiene que saber que django va a crear
automaticamente permisos para aplicaciones.
Ahora ya tenemos los cambios aplicados, ahora para comprobar que ya esta y en este caso
que esta con sqlite3 desde django podemos ver si en verdad esta, para verlo django nos da
una herramienta el cual es el administrado django.
Para acceder a esta administracion lo primero que necesito es un servidor para levantar el
proyecto pero no se instalara nada porque django tine su propio server:
“python manage.py runserver”
por defecto lo levanta en el puerto 8000, uno le puede cambiar el puerto “python manage.py
runserver 0.0.0.0:8006” - “python manage.py runserver 0:8006”
y aparecera lo siguiente:
Si ponemos “localhost:8000/admin”
se debe crear un ausrio para
acceder a esto:”python
manage.py createsuperuser”
CONFIGURAR POSTGRESQL CON DJANGO:
Un grupo
los permisos ya
bienen definidos,
django cuando se
crean los permisos
django lo que hace
es anadirle a ese
modelo tres permisos
(el primero es
cambiar, el segundo
modificar y tercero
eliminar ese modelo).
u autor puede ser liminado y modificado y agregado por un usuario llamado:
“supervisor”. Para esto sirven estos grupos.
Usuarios:
para saber que el modelo existe de verdad.
Para saber que sea visible en esta pantalla cada vez que se agreguen:
para registrarlo solo es ir al archivo admin.py luego de esto importamos el modelo de autor y
para registrarlo se hace lo de la linea 4.
Ahora la clase Meta indica metadatos, datos extra que se le agreguen al modelo, en este
caso se le agregara datos para como se deberia mostrar en la pagina principal:
RELACIONES EN MODELOS:
uno a uno, uno a mucho y muchos a muchos, para crear las relaciones veremos un ejemplo
con autor y libro y como crear esas relaciones.
solo seria necesaria la linea de codigo 23, en donde se indicaria la relacion que se genera y
sobre que clase es que existe esa relacion, aca un libro tiene un autor y un autor tiene un
libro.
Ahora si hicieramos la migracion arrojaria un error, porque le hace falta un parametro el cual
es on_delete en donde se le indica que en caso de eliminar el elemento se borre el otro
tambien de la otra tabla:
Uno a muchos:
un autor puede tener varios libros y un libro solo puede tener un autor, para indicarle esto se
coloca:
Muchos a muchos:
cuando un libor tiene muchos autores y un autor tiene muchos libros.
Solo tendria que colocar ManyToManyField y la clase con la que tiene relacion, aqui ya no
debo colocar el otro parametro.
----------------------------------------------------------------------------------------------------------------------------
fecha de creacion:
el auto_now hace que se anada cada vez que se haga una creacion o modificacion, se
actulizara con la fecha actual
EL ARCHIVO FORMS:
Ahora se va a realizar un CRUD.
Django ya trae con sigo un codigo para realizar un CRUD, eso lo podemos ver en la parte de
administracion, pero yo no tengo accesibilidad a estas funcionalidades. Para ello se debe
crear un codigo para que realicen estas acciones.
Entonces dentro de la aplicacion se creara un archivo llamado forms.py, django nos ahorra
trabajo para crear un objeto, sabemos que para la creacion se usa un formulario estos
formularios son los que hacemos en el HTML.
Pero django trae una ayuda que nos crea un formulario por nosotros y nosotros o tengamos
que crear todo eso. Entonces djnago trae una clase que ayuda a esto y se llama forms:
entonces en este archivo voy a crear una clase que me va a representar al formulario
correspondiente a cada moledo al cual le quiero realizar un CRUD.
Para nombrar las clases pertenecientes a cada moleta se va a usar una convecion “class
ModeloForm(forms.ModelForm)” recibira una herencia de ModelForm(se van a heredar los
campos del modelo y no se tocara crear exactamente los campos como si fuera un formulario
nuevo), puede ser tambien de solo form.
Ahora se va a definir otra clase dentro de esta que se va a llamar Meta esta clase hace
referencia a los metadatos que se van a manejar en el formulario, es importante definirla
porque en ell a va a ir algo que nos va a ahorar codigo:
un parametro es model = y va a ser referencia al modelo que pertenecera este form, se debe
importar el modelo, como se importar de una misma carpeta se antepone el .
Ademas del model se le debe anadir el field este hace refencia todos los campos rellenados
cuando se cree un autor (es decir los campos que se deben agregar, por ejemplo el id no se
deberia tener porque este se crea solito) entonces en esta lista iran los campos que deben
ser llenados para crear el autor:
ENLAZAR URLS DE APLICACION CON URLS DE
PROYECTOS:
Ahora veremos la parte de URLs y el archivo views, para comenzar a realizar el CRUD, lo
que se hara es enlzar la aplicacion libro y el archivo de url principal del proyecto:
para hacer esto y no tener todas las urls, en este archivo, lo que se hace es que cada
aplicacion va a tener su propio archivo de URLs y es ahi donde tendre las URLs
pertenecientes a esa aplicacion:
porque debe enlazar este arhivo de urls, con el archivo de URLs de todo el proyecto, para
hacer esto la manera de hacerlo es de la siguiente forma:
entonces se debe importar include, como se ve en la linea 17, el cual me permitira incluir
archivo o archivos URLs pertenicientes de mi proipo proyecto o externas, y ahi vemos unos
ejemplos que deja el proyecto.
Ahora para hacerlo no se hara como se muestra en el ejemplo (el segundo parametro se
hara diferente porque se quiere dar un identificador a todo este conjunto de URL de la
aplicacion, en django podemos nombrar a los archivos URLs como si fueran espacios de
trabajo es decir cuando cuando quiera llamar a una URL voy a poder hacer lo siguiente: “url :
nombre que identifica al conjunto de urls de la aplicacion: y la URL especifica de la aplicacion
a acceder”
aca indica como hacerlo pero en este caso no sirve porque el name es cuando se llama a la
vista, y como yo llamo a un archivo no se puede poner de esta manera.
) sino que el segundo parametro se le pasara un tupla la cula recibira dos cosas, el primero
parametro va a ser la ruta del archivo como tal de las URLs de mi aplicacion y el segundo
parametro es el nombre que va a ser el identificador de todas estas URLs pertenecientes a
mi aplicacion libro:
linea 21.
PRIMERA VISTA, PRIMERA URL Y PRIMER
RENDERIZADO DE UN TEMPLATE:
Ahora que vimos como enlazar las URLs de la aplicacion con la del proyecto veremos
que si iniciamos el servidor nos dara un error y esto pasa porque django no reconoce el
archivo “urls.py” como un archivo de URLs que pueda usar el proyecto, esto sucede porque
la estructura de URLs en django debe tener una lista que es la que se ve a continuacion:
y el error nos dice eso que no tiene un patterns valido y que aparentemente este no existe:
y esto era lo que haci falta agregar para que la conexion se efectura por completo, ya que
django analiza el archivo indicado en la imagen arriba de esta en la linea 21, y tiene que
encontrar algo esencial que es el urlpatterns el cual debe tener la aplicacion.
Ahora para poder crear algo en el archivo de urls de mi aplicacion primero debo ir al archivo
views.py y se creara una vista sencilla para que yo cuando ingrese a una URL me pinte un
template; para hacerlo se creara una funcion, la cual recibira un parametro llamado request
que es el parametro que toda funcion debe recibir cuando vamos a trabajar con peticiones
que vengan del navegador (este parametro tendra la interaccion que hizo el usuario en el
navegador, ). esta funcion solo retornara una linea en donde se usara el metodo render que
se importa por defecto cuando se crea el modelo, el cual lo que hace es renderizar
templates, para indicarle esto recibe unos parametros, el primero es uin request que es la
peticion (porque va aa responder algo de acuerdo a la peticion que le envian), el siguiente
parametro es el template que renderizar, el template que renderizara es el que esta en la
carpeta “libro/index.html”
ahora debo asignar eso de ahi a una URL para poder obtener lo que quiero, ahora en el
archivo de urls de la aplicacion se importara home de views, y se ara lo siguiente. Path recibe
tres parametros el primero es el texto que escribira en la barra de direccion y es el necesario
para acceder que este en la funcion que se le pasa como siguiente parametro el cual es
home, cuando escribamos el texto accedera a esa funcion y ejecutara lo que este ahi, y el
ultimo parametro es el nombre identificador para toda la URL por si quiero usarlo en algun
sitio (este nombre solo es usado por plantillas django si no se usa eso ese tercer
parametro no se coloca).
Ahora sucede algo que si accedermos a la url nos dira que el template no existe, ya que el
template que se coloco en la imagen de arriba no existe asi que se debe crear el template,
ahora para estructurar los templates en mi proyecto, en la carpeta raiz se creara un folder
llamado template, dentro de cada template se creara una capeta con el nombre de cada
aplicacion, de esta forma se tendra un mayor nombre
ahora por ultimo para que funcione toca ir al archivo de configuracion donde dice templates,
ahi hay un parametro llamado DIRS que es donde van a estar nuestros templates
y se pone el nombre de la carpeta, ahora si llega a salir error se reinicia el servidor para que
coja los cambios que se realizaron.
VISTAS BASADAS EN FUNCIONES: CREAR AUTOR:
para continuar se realizaran algunos cambios. Se vera el proceso de como realizar la vista de
creacion.
Se van a realizar unos cambios en donde el index como no deberia estar en libro, ya que ese
index va a ser como el home de toda la aplicacion por lo cual se realizaran unos cambios, lo
primero es pararse en “urls.py” de la aplicacion y se importara el home que se realizo en
apps.libro.views:
----------------------------------------------------------------------------------------------------------------------------
para crear mi vista vamos al archivo de views y crearemos el renderizado de la vista de
crearAutor por lo cual crearemos una funcion con este nombre y que recibe por parametro el
request; ahora cuando interactuamos con el navegador se hace a traves del protocolo http y
este tiene unos metodos definidos para ciertas acciones que se quieran realizar. (get,
post..etc), entonces las acciones a realizar a continuacion es un metodo get el cual me
renderiza la pagina y uno de post que es cuando yo llene el formulario y envie eso.
entonces al instanciarlo le dire que esta instancia reciba todos los datos que se le han
mandado y esos datos estan en el request.post y ahora lo que se preguntara si los datos
enviados son correctos para poderlos guardar, para ello hay una funcion que trae los
formulario en django que es is_valid() lo que hace es validar mi formulario es decir si el tipo
ingresado en el input es igual al que tengo en mi base de datos, si no exceso los
caracteres..etc, esto se valida automaticamente, si es valido espero que mi aplicacion
registre todos estos datos en mi base de datos. Por lo cual se realizara la funcion .save sobre
la instancia creada de autoFomr y este es un metodo que tiene todo modelo que herede de
models.Model, este metodo lo que hace es registrar en la base de datos lo que se se alla
enviado en el formulario es decir lo que este en autorForm():
ahi yo ya tendria guardado en la base de datos todos los campos que realice.
Ahora luego de guardarla me redireccione a otra URL de todas las que tengo:
para ello se usa el metodo redirect el cual recibe la URL pero no se pondra la url porque ne
python las urls tienen un nombre asociado y ese es el que se pondra:
entonces esto es correcto si es enviar informacion, ahora si me llega un apeticion para cargar
la pagina de creacion en este caso el metodo seria un metodo Get entonces se instancia una
variable de autoForm() pero sin contenido para que me cree el contenido html perteneciente
a cada atributo del modelo que he realizado y esto debo retornarlo a mi template para
retornarlo debo hacer un return general de la funcion, ahora como tercer parametro lde debo
retornar el autoForm pero lo devolvere en un diccionario:
no olvidar importar autorForm ya que lo estamos usando.
----------------------------------------------------------------------------------------------------------------------------
ahora falta cerar la url para esta vista y el template:
ahora lo primero crearemos la url:
Ahi dentro es que se va colocar la variable que se le colocaba en views que es auto_form
que es una instancia de AutoForm().
Entonces primero en la etiqueta se le pone el metodo.
Las varibales se pintan en el sistema de plantillas de django con
{{ nombreVariable(auto_form}}, como es un formulario es pintarlo de alguna manera de las
que nos ofrece django una es con un parrafo y otra como una tabla, aca se va a usar como
un parrafo entonces se coloca {{ autor_form.as_p}} el “as_p” lo pinta como uin parrafo
(“as_table” lo pinta como tabla).
Ahora faltaria el boton de crear.
y al ir a la pagina se ve lo siguiente:
Ahora el crea esto con las caracteristicas que tenga mi modelo autor.
Ahora para ver que es lo que me trae autor_form le ponemos lo siguiente a la funcion
crearAutor():
---------------------------------------------------------------------------------------------------------------------------
algo y es lo siguiente:
la otra manera que tienen dejango para renderizar es con “ginja2”, en caso de que se quiera
averiguar en la documentacion se puede encontrar.
La filosofia de django es que no repitas el codigo que no hagas algo dos veces, entonces al
tener esta filosofia cuando escribimos HTML tendemos a repetir vario codigo qu tebe tener
toda pagina web, para horrar el trabajo escribes el template de tu pagina una sola vez y al
escribirlo una sola vez hacer que los demas templates hereden de este template base, un
template que hereda de otro tendra las caracteristicas del que hereda.
Entonces para heredar el template se coloca como esta en la linea 1 en donde como el
archivo index esta en la raiz del directorio “templata” por eso se importa de esa manera, otra
cosa es que cuando hereda omite todo lo que esta bajo por lo que si queremos escribir lo
quetenemos en este HTML se debe meter dentro de los tag creados
si quisieramos usar if o for dentro del template
para realizarlo es de esta form:
Lo primero que se realizara es ingresar a la shell de python dentro del proyecto (“python
manage.py shell”:
aca lo que se realizara es traer los modelos con los que se trabajara en este caso el de autor
y como ya se esta ejecutando la shell en el proyecto no se debe importar el archivo settings
lo que ser relizara es lo siguiente para importar el modelo de autor:
“from apps.libro.models import autor” entonces como no se va usar SQL puro, el ORM
que tiene django esta enlazado con todo modelo que creemos lo que se hace es usar un
atributo que tiene todo modelo y es “objects” el cual hace referencia a una clase llamada
objectManager, esta clase es la que se encarga de realizar la peticion y consultas a la base
de datos.
Entonces por medio de este ORM si yo quiero crear un autor, llamo la clase luego el atributo
object y de este el metodo create al cual se le pasan los atributos que tienen autor, y al
ejecutarlo me devuelve el autor que cree y eso indica que quedo registrado:
la segunda manera es instanciar un nuevo objeto de autor y asi como haciamos en el archivo
views.py que poniamos la instancia he imbocabamos el metodo save:
Ahora si yo quiero filtrar solo los que sena de peru utilizo filter()
en la documentacion de django hay varias cosas que se pueden hacer dentro de las queries
y ademas cosas mucho mas complejas.
Ahora hay dos formas de crear una URL la primera es con “path” y la otra es con otra funcion
llamada “re_path” esta funcion es la manera en que se hacia antes de usar path. Con path
para pasar parametros se mete dentro <> dentro indicamos el tipo de dato a pasar y el
nombre que tiene:
slug es un string.
en versiones 1.11 no se existia path y re_path se trabajaba con url() t aca se trabajaba con
expreciones reculares, y se escribian de la siguiente manera:
ahora hoy en dia podemos trabajar con expreciones regulares ya que no se existe url en
django dos en adelante, esto mismo se trabaja usando re_path, entonces permite usar
expreciones regulares que se usan en django 1.11: