Python/Django

Elena Marrero Méndez

#PyDayTF 11/03/2017

Elena Marrero Méndez

RoadMap

  • Preparación del entorno
  • Filosofía de Django
  • Crear Proyecto
  • Crear Aplicación
  • Interfaz de Administración
  • Interfaz Pública

Preparación del entorno (I)

Tecnologías a utilizar

  • python 3.6
  • django 1.10
  • virtualenv
  • pip

Ejercicio 1

Utilizando las herramientas mencionadas, preparar un entorno de trabajo para nuestro proyecto django

Preparación del entorno (II)

virtualenv


$ sudo apt-get install -y python-pip
$ sudo -H pip install virtualenv -U
$ virtualenv myvenv -p python3.6
                    

Trabajando en nuestro virtualenv

Aislamiento de todas las dependencias


$ . myvenv/bin/activate
(myvenv)$ pip install django
                    

Chequear la versión de django (1.10.6)


(myvenv)$ python -c "import django; print(django.get_version())"
                    

Filosofía de Django

Django is a high-level Python Web framework that encourages rapid development and clean, pragmatic design
  • Ridículamente rápido
  • Tranquilizador y seguro
  • Excesivamente escalable
  • Increíblemente versátil
  • Sigue el principio DRY
    (Don't Repeat Yourself)

Filosofía de Django (II)

Model-View-Template

Filosofía de Django (III)

Garantiza la modularidad y reusabilidad

Proyecto (project)

Configuración y aplicaciones de un sitio web

Aplicación (app)

Aplicación web que cumple una funcionalidad

Ejercicio 2

Gestor de eventos


Crear la estructura de un proyecto django al que llamaremos django_pyday2017 y configurarlo

Crear Proyecto


(myvenv)$ django-admin startproject django_pyday2017
                    

Estructura de directorios


django_pyday2017
├─── manage.py           - python manage.py (no tocar)
└─── django_pyday2017
        settings.py      - Configuración del proyecto
        urls.py          - Asociar URLs a vistas
        wsgi.py          - Servidor wsgi (no tocar)
        __init__.py      - Paquete (no tocar)
                    

Crear Proyecto (II)

settings.py contiene la configuración del sitio web


ALLOWED_HOSTS = ['*', ]
...
TIME_ZONE = 'Atlantic/Canary'  # Zona Horaria
LANGUAGE_CODE = 'es'  # Código de Idioma
...
STATIC_URL = '/static/'
STATIC_ROOT = 'collected_static'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "static"),
]
                    

https://docs.djangoproject.com/en/1.10/ref/settings/

Crear Proyecto (III)

Gran variedad de opciones de bases de datos: PostgreSQL, MySQL, SQLite, Oracle, ...


DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': 'mydatabase',
    }
}
                    

Creación de la Base de Datos


(myvenv)$ python manage.py migrate
                    

https://docs.djangoproject.com/en/1.10/ref/settings/#databases

Crear Proyecto (IV)

Para servir los ficheros estáticos necesitamos añadir una nueva url en el fichero urls.py


from django.conf import settings as st
from django.conf.urls.static import static

urlpatterns = [
    # ... resto de tus URLs ...
] + static(st.STATIC_URL, document_root=st.STATIC_ROOT)
                    

https://docs.djangoproject.com/en/1.10/ref/urls/

Recolectar los archivos estáticos


(myvenv)$ python manage.py collectstatic
                    

Lanzar el Servidor de Desarrollo


(myvenv)$ python manage.py runserver
                    

Verifica que tu sitio web está corriendo

http://127.0.0.1:8000/

Fichero de requisitos

requirements.txt contiene todos los paquetes que serán necesarios para el proyecto

.
├── db.sqlite3
├── django_pyday2017
│   ...
├── manage.py
└── requirements.txt
                    

Lanzar la instalación de requisitos


(myvenv)$ pip install -Ur requirements.txt
                    

Ejercicio 3

Añadir el módulo django-extensions

Extensión de comandos propios del manage.py

https://django-extensions.readthedocs.io/en/latest/installation_instructions.html

Añadir el módulo django-extensions

  • Añadirlo al requirements.txt e instalarlo
  • Añadirlo en INSTALLED_APPS en el settings.py
    
    INSTALLED_APPS = [
        ...,
        'django_extensions',
    ]
                        
  • Actualizar la base de datos
    
    (myvenv)$ python manage.py migrate
                        

Arrancamos la aplicación con modo debug integrado


(myvenv)$ python manage.py runserver_plus
                    

Ejercicio 4

Gestor de eventos

Crear una aplicación en django llamada events que servirá para gestionar y publicar un listado de próximos eventos, así como para gestionar las inscripciones a los mismos.

Crear Aplicación


(myvenv)$ django-admin startapp events
                    

Añadir la aplicación en INSTALLED_APPS en el settings.py

Crear Aplicación (II)

Estructura de directorios


.
├── db.sqlite3
├── django_pyday2017
│   ...
├── events
│   ├── admin.py         - Interfaz administrativa
│   ├── apps.py          - Configuración de la aplicación
│   ├── __init__.py
│   ├── migrations       - Migraciones de la BBDD
│   │   └── __init__.py
│   ├── models.py        - Definición de la BBDD
│   ├── tests.py         - Tests
│   └── views.py         - Gestión de los datos
├── manage.py
└── requirements.txt
                    

Modelos

  • Crear la definición de los modelos en el archivo models.py
    https://docs.djangoproject.com/es/1.10/ref/models/fields/
  • Generar, ver y aplicar las migraciones de la BBDD respecto a los modelos
    
    (myvenv) $ python manage.py makemigrations events
    (myvenv) $ python manage.py sqlmigrate events 0001
    (myvenv) $ python manage.py migrate
                        

Interfaz de administración

Crear un superusuario


(myvenv) $ python manage.py createsuperuser
Username (leave blank to use 'pyday'): admin
Email address: a@a.es
Password: pyday2017
                

Registramos los modelos editando admin.py.


from django.contrib import admin
from .models import Evento, Inscripcion

admin.site.register(Evento)
admin.site.register(Inscripcion)
                    

http://127.0.0.1:8000/admin

Object-Relational Mapper (ORM)

API que permite la abstracción de la BBDD:

  • Crear, modificar y borrar tuplas (objetos)
  • Obtener tuplas (get, filter, all)
  • Contar, ordenar, ...

Abrimos una shell interactiva del proyecto y empezamos a jugar


(myvenv) $ python manage.py shell_plus
                

https://docs.djangoproject.com/en/1.10/topics/db/queries/

Ejercicio 5

Gestor de eventos

Añadir funcionalidad a la Interfaz Administrativa

https://django-extensions.readthedocs.io/en/latest/installation_instructions.html

  • Añadir el número de inscritos en un evento
  • Añadir inscripciones desde el propio evento
  • Añadir un filtro lateral
  • Publicar eventos de forma masiva
  • ...

Interfaz pública

Model-View-Template

URLs

Añadir nuestra aplicación al urls.py general


from django.conf.urls import url

urlpatterns = [
    ...
    url(r'^evento/', include('events.urls')),
    ...
]
                    

En el específico, definir una por cada acción que se quiera realizar.


url(r'^(?P<evento_id>\d+)/$', views.detalle, name='detalle'),
                

Vistas genéricas

Las vistas genéricas abstraen los patrones comunes hasta el punto en que ni siquiera es necesario escribir código Python para escribir una aplicación.
Generic Views

https://docs.djangoproject.com/en/1.10/ref/class-based-views/

Plantillas

Creación del directorio templates en la raíz del proyecto y un subdirectorio por cada aplicación.


.
├── events
|   ...
├── manage.py
├── requirements.txt
├── static
│   ...
└── templates
    ├── base.html             - Genérica con bloques definidos
    └── events
        ├── ..._detail.html   - Extienden de base y rellenan
        └── ..._form.html         los bloques
                    

https://docs.djangoproject.com/en/1.10/ref/templates/language/

Ejercicio 6

Gestor de eventos

Añadir la siguiente funcionalidad pública

  • Listado de los eventos públicos
  • Detalle de un evento en particular
  • Inscripción en un evento accesible desde el detalle y desde el listado
  • Detalle de la inscripción
  • ...

Gracias!

Elena Marrero Méndez

#PyDayTF 11/03/2017