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