No programes sin framework
Python & Django
Os tengo que contar una historia
Backend
La alegría de ser un backed
Los comienzos de los backend
Backend "en paro"
El boom de los backend
Cada vez hay más curro ya que todo necesita un backend
Ventajas de ser backend
Capacidad de elección de tecnología
Resoluciones
Pasamos de...
Navegadores
Dispositivos móviles
¿Qué es un framework?
Características de un framework backend
Características
- Gestión de Sesiones
- Request
- Gestión de URL's
- Login y registro de usuarios
- Sistema de plantillas
- Caché
- Caché de plantillas
- Modelos y Relaciones
- ORM
- Gestión de archivos estáticos
Python
Historia
- Python fue creado a finales de los ochenta por Guido van RossumBullet Two
Mi primer contacto con el lenguaje
Características
-
Lenguaje de alto nivel
-
Rápida curva de aprendizaje => novatos
-
Fácil lectura
-
Más tiempo leyendo código que programando
-
Multiplataforma
-
Multipropósito
Características
-
Fácil manejo de datos
-
Manejo de listas
-
Objetos
-
Obtener atributos
-
Setearlos
-
-
Programación orientada a objetos "bonita"
-
Sintaxis limpia
-
PEP
- Librerías
En otras palabras
if elemento not in lista
Si el elemento no está en la lista
The Zen of Python
The Zen of Python
Guía de estilos
# Declaración
a = 5
b = 4
Variables
# Tipado dinámico
a = 5
b = 'Hola mundo'
a = b
# Intercambiar valores
a = 5
b = 4
a,b = [b,a]
Variables
Listas
>>> lista = ["abc", 42, 3.1415]
>>> lista[0] # Acceder a un elemento por su índice
'abc'
>>> lista[-1] # Acceder a un elemento usando un índice negativo
3.1415
>>> lista.append(True) # Añadir un elemento al final de la lista
>>> lista
['abc', 42, 3.1415, True]
>>> del lista[3] # Borra un elemento de la lista usando un índice (en este caso: True)
>>> lista[0] = "xyz" # Re-asignar el valor del primer elemento de la lista
>>> lista[0:2] # Mostrar los elementos de la lista del índice "0" al "2" (sin incluir este último)
['xyz', 42]
>>> lista_anidada = [lista, [True, 42L]] # Es posible anidar listas
>>> lista_anidada
[['xyz', 42, 3.1415], [True, 42L]]
>>> lista_anidada[1][0] # Acceder a un elemento de una lista dentro de otra lista (del segundo elemento, mostrar el primer elemento)
True
Listas
Métodos nativos como:
sort, reverse, len, min, max, remove, count, map, slice
Tuplas
>>> tupla = ("abc", 42, 3.1415)
>>> tupla[0] # Acceder a un elemento por su índice
'abc'
>>> del tupla[0] # No es posible borrar (ni añadir) un elemento en una tupla, lo que provocará una excepción
( Excepción )
>>> tupla[0] = "xyz" # Tampoco es posible re-asignar el valor de un elemento en una tupla, lo que también provocará una excepción
( Excepción )
>>> tupla[0:2] # Mostrar los elementos de la tupla del índice "0" al "2" (sin incluir este último)
('abc', 42)
>>> tupla_anidada = (tupla, (True, 3.1415)) # También es posible anidar tuplas
>>> 1, 2, 3, "abc" # Esto también es una tupla, aunque es recomendable ponerla entre paréntesis (recuerda que requiere, al menos, una coma)
(1, 2, 3, 'abc')
>>> (1) # Aunque entre paréntesis, esto no es una tupla, ya que no posee al menos una coma, por lo que únicamente aparecerá el valor
1
>>> (1,) # En cambio, en este otro caso, sí es una tupla
(1,)
>>> (1, 2) # Con más de un elemento no es necesaria la coma final
(1, 2)
>>> (1, 2,) # Aunque agregarla no modifica el resultado
(1, 2)
Diccionarios
>>> diccionario = {"cadena": "abc", "numero": 42, "lista": [True, 42L]}
>>> diccionario["cadena"] # Usando una clave, se accede a su valor
'abc'
>>> diccionario["lista"][0]
True
>>> diccionario["cadena"] = "xyz" # Re-asignar el valor de una clave
>>> diccionario["cadena"]
'xyz'
>>> diccionario["decimal"] = 3.1415927 # Insertar un nuevo elemento clave:valor
>>> diccionario["decimal"]
3.1415927
# También es posible que un valor sea un diccionario
>>> diccionario_mixto = {"tupla": (True, 3.1415), "diccionario": diccionario}
# Acceder a un elemento dentro de una lista, que se encuentra dentro de un diccionario
>>> diccionario_mixto["diccionario"]["lista"][1]
42L
Diccionarios
Métodos nativos como:
keys(), values(), items(), copy(), has_key()
Conjuntos
>>> conjunto_inmutable = frozenset(["a", "b", "a"])
>>> conjunto_inmutable
frozenset(['a', 'b'])
>>> conjunto1 = set(["a", "b", "a"]) # Primer conjunto mutable
>>> conjunto1
set(['a', 'b'])
>>> conjunto2 = set(["a", "b", "c", "d"]) # Segundo conjunto mutable
>>> conjunto2
set(['a', 'c', 'b', 'd']) # Recuerda, no mantienen el orden, como los diccionarios
>>> conjunto1 & conjunto2 # Intersección
set(['a', 'b'])
>>> conjunto1 | conjunto2 # Unión
set(['a', 'c', 'b', 'd'])
>>> conjunto1 - conjunto2 # Diferencia (1)
set([])
>>> conjunto2 - conjunto1 # Diferencia (2)
set(['c', 'd'])
>>> conjunto1 ^ conjunto2 # Diferencia simétrica
set(['c', 'd'])
Conjuntos
Métodos nativos como:
intersection, diferencia, union, diferencia_simétrica
Listas por comprensión
>>> range(5)
[0, 1, 2, 3, 4]
>>> [i*i for i in range(5)]
[0, 1, 4, 9, 16]
>>> lista = [(i, i + 2) for i in range(5)]
>>> lista
[(0, 2), (1, 3), (2, 4), (3, 5), (4, 6)]
>>> g = [ x ** 2 for x in range (10)]
[0 , 1 , 4 , 9 , 16 , 25 , 36 , 49 , 64 , 81]
Slices
>>> x = range (1 , 10)
>>> x
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> x [:3]
[0 , 1, 2]
>>> x[:2]
[1, 2]
>>> x[:2]
[1, 2]
>>> x[-1]
9
>>> x[1:6:2]
[2, 4, 6]
x[start:end:step]
Pregunta
¿Alguna vez habéis intentado hacer una lista con los primeros 1000000000 números?
>>> [ x ** 2 for x in xrange (1000000000000000)]
# Tu ordenador explota
Generadores
¿Qué son?
>>> cuadrados = ( x ** 2 for x in range (1 , 11))
>>> cuadrados
< generator object < genexpr > at 0 x7f8b82504eb0 >
>>> next ( cuadrados )
1
>>> next ( cuadrados )
4
>>> cuadrados = ( x ** 2 for x in range (100000000000000))
>>> cuadrados
< generator object < genexpr > at 0 x7f8b82504eb0 >
>>> next ( cuadrados )
1
>>> next ( cuadrados )
4
Operadores lógicos
&& => and
|| => or
! => not
Condicionales
>>> verdadero = True
>>> if verdadero: # No es necesario poner "verdadero == True"
... print "Verdadero"
... else:
... print "Falso"
Verdadero
>>> lenguaje = "Python"
>>> if lenguaje == "C":
... print "Lenguaje de programación: C"
... elif lenguaje == "Python":
... print "Lenguaje de programación: Python"
... else:
... print "Lenguaje de programación: indefinido"
...
Lenguaje de programación: Python
>>> if verdadero and lenguaje == "Python":
... print "Verdadero y Lenguaje de programación: Python"
...
Verdadero y Lenguaje de programación: Python
Economía de condicionales
>> x = 4
>> x == 3 or x == 5 or x == 7:
False
>> x in (3 , 5 , 7)
False
>>> any ([ False , True , False ])
True
>>> any ([ False , False ])
False
>>> any ([])
False
>>> all ([ False , True , False ])
False
>>> all ([ True ])
True
>>> all ([])
True
Operador ternario
En casi todos los lenguajes
test ? a : b
En python
a if test else b
>>> x = 2
>>> " uno " if x == 1 else " otra cosa "
"otra cosa"
Bucles
>>> lista = ["a", "b", "c"]
>>> for i in lista: # Iteramos sobre una lista, que es iterable
... print i
...
a
b
c
>>> numero = 0
>>> while numero < 10:
... numero += 1
... print numero,
...
1 2 3 4 5 6 7 8 9
Sistema de objetos
Totálmente compatible con POO
Herencia múltiple
Sobrecarga de métodos
Sistema de objetos
Sistema de objetos
>>> cadena = "abc"
>>> cadena.upper()
'ABC'
>>> lista = [True, 3.1415] #List
>>> lista.append(42L)
>>> lista
[True, 3.1415, 42L]
>>> int ( True )
1
>>> int ( False )
0
>>> 37 + True
38
>>> 7 / False
Traceback ( most recent call last ):
File " < stdin > " , line 1, in < module >
ZeroDivisionError : float division
Intérprete
Integración con el OS
os
sys
Comparativa IDE's
Referencias
Ya se python
Django
Historia
Nació en el otoño de 2003
The World Online
Toda su línea editorial en la red está basada en su propia versión del padre de Django
Framework
MTV
MTV
MTV
MTV
BBDD
BBDD - Migrations
Models
Syncdb
ORM
Sin ORM:
SELECT * FROM Alumno WHERE edad = 17
Con ORM:
Alumno.objects.filter(edad = 17)
No te convenció?. Tal vez esto sí lo haga
Sin ORM:
SELECT * FROM “autores_autor” INNER JOIN “autor_libro” ON (“autores_autor”.”id” = “autores_libro”.”autor_id”)
INNER JOIN “autores_libro_librerias” ON (“autores_libro”.”id” = “autores_libro_librerias”.”libro_id”)
INNER JOIN “autores_libreria” ON (“autores_libro_librerias”.”libreria_id” = “autores_libreria”.”id”) WHERE “autores_libreria”.”nombre” = “La Cultura”
Con ORM:
Autor.objects.filter(libros__libreria__nombre = “La Cultura”)
ORM
Vistas (lógica)
Function Views
Vistas (Class Based Views)
Templates (presentación)
<table class="table datatable table-bordered table-striped">
<thead>
<tr>
<th class="text-center">Acción</th>
<th>Nombre</th>
<th>Apellidos</th>
<th>Email</th>
<th>Grupos</th>
<th>Último inicio de sesión</th>
</tr>
</thead>
<tbody>
{% for u in user_list %}
<tr>
<td class="text-center">
<a href="{% url 'team:teammember_detail' u.pk %}">
<i class="fa fa-pencil"></i>
</a>
</td>
<td>{{ u.first_name }}</td>
<td>{{ u.last_name }}</td>
<td><a href="mailto:{{ u.email }}">{{ u.email }}</a></td>
<td>
{% for g in u.groups.all %}
{{ g.name }}<br>
{% endfor %}
</td>
<td>{{ u.last_login|default:"Nunca" }}</td>
</tr>
{% endfor %}
</tbody>
</table>
Separar lógica de presentación
Herencia de plantillas
Bloques
Condicionales
Bucles
Template Tags
Custom Template Tags
Templates (presentación)
urlpatterns = [
path('visits-variant-visit/<int:pk>/',
VisitGetVariant.as_view(),
name='visit_variant_visit'
),
path('visit-variant-forbidden-dates/<int:pk>/',
VisitVariantForbiddenDates.as_view(),
name='visit_variant_forbidden_dates'
),
path('visit-variant-rate-day/<int:pk>/<int:year>/<int:month>/<int:day>/',
VisitVariantRateDay.as_view(),
name='visit_variant_rate_date'),
path('visit-variant-available-dates/<int:pk>/',
VisitVariantAvailableDates.as_view(),
name='visit_variant_available_dates'),
path('', include(router.urls))
]
URL
Formularios
Formularios
Formularios
Formularios
django-crispy-forms
i18n
django-rosetta
django-modeltranslation
Middleware
Shell
Servidor de desarrollo
Caché
Aplicaciones plug and play
django packages
django packages
Quien lo usa
instagram, the new york times, pinterest, nasa, mercedes, national geographic, the whashington post,
Referencias
http://django.es/docs/
http://stackoverflow.com/
La joya de la corona ADMIN
El admin de django es el mejor invento del mundo a la hora de tener un panel de control de entidades, relaciones y datos.
Crea tus API's con
Django Rest Framework
DEMO
Sorry. . .
Tranquilos
Cookiecutter Django’s
Cookiecutter Django’s
¿Algo que objetar?
?
@bienvenidosaez
Copy of No programes sin framework - Python & Django
By Bienvenido Sáez Muelas
Copy of No programes sin framework - Python & Django
Taller introductorio a las posibilidades que nos ofrece todo framework de programación a la hora de realizar tareas básicas de toda aplicación web.
- 134