Slide 1

Slide 1 text

No content

Slide 2

Slide 2 text

¿Django?

Slide 3

Slide 3 text

Django! Un framework web de alto nivel escrito en Python que fomenta el desarrollo rápido y limpio 
 y el diseño pragmático.

Slide 4

Slide 4 text

Django Reinhardt Nombrado en honor a

Slide 5

Slide 5 text

¿Quién usa Django?

Slide 6

Slide 6 text

Django en SecurityHub

Slide 7

Slide 7 text

★ Python es un lenguaje de script de código abierto ★ Es multiplataforma: Linux, Mac OS X, Windows... ★ Es multiparadigma: Funcional y orientado a objetos ★ Es muy legible y conciso ★ Es interpretado: No necesitamos compilar nuestros programas ★ Python es fuertemente tipado pero tiene tipos dinámicos:
 Una variable puede cambiar de tipo en ejecución pero el tipo se tiene en cuenta para las operaciones ★ Es integrable con C, C++, Java y otros lenguajes Django es Python

Slide 8

Slide 8 text

En la redacción de World Online para crear aplicaciones web rápidamente con fechas ajustadas Nace en un entorno periodístico

Slide 9

Slide 9 text

Django sigue el principio

Slide 10

Slide 10 text

Sigue el patrón MTV Separa datos, interfaz de usuario y lógica de control: ★ Model → modelo de datos (models.py) ★ View →vistas de datos (views.py): qué datos se presentan ★ Template → plantillas de páginas (generalmente archivos HTML): 
 cómo se presentan los datos El controlador es el propio framework

Slide 11

Slide 11 text

¿Qué hace Django? ★ Provee una estructura de trabajo bajo el patrón Model Template View ★ Mapea objetos Python con la base de datos (ORM) ★ Permite diseñar URLs amigables para buscadores (útil para SEO) ★ Tiene un sistema de plantillas sencillo para diseñadores ★ Genera una interfaz de administración automática ★ Dispone de un framework para manejar formularios ★ Puede gestionar sesiones de usuario, autenticación, caché, almacenamiento, sitemaps, internacionalización, etc.

Slide 12

Slide 12 text

Django es modular

Slide 13

Slide 13 text

Usa lo que quieras, integra lo que necesites ★ Backends almacenamiento de archivos ★ Backends de cache ★ Backends de autenticación ★ Sitio de administración ★ Sistema de templates de Django o uno propio ★ etc.

Slide 14

Slide 14 text

Aplicaciones contrib ★ auth: Autenticación de usuarios. ★ admin: Sitio de administración CRUD. ★ messages: Mensajes de aviso para usuarios. ★ sessions: Gestión de sesiones. ★ sites: Manejar distintos sitios web con un proyecto. ★ sitemaps: Generar sitemaps a partir de modelos. ★ syndication: Generar feeds RSS y Atom a partir de modelos. ★ gis: Trabajar con datos ego-espaciales (PostGIS)

Slide 15

Slide 15 text

Organización de un proyecto Django ★ Un desarrollo es un Proyecto ★ Un proyecto consta de una o varias aplicaciones ★ Cada aplicación hace algo en concreto ★ Proyecto: "Comunidad web" 
 Aplicaciones: blog, foro, registro de usuarios, tienda on-line, newsletter, agregador de feeds... ★ Una aplicación puede ser utilizada por distintos proyectos a la vez ★ Un proyecto puede hacer funcionar varios sitios web

Slide 16

Slide 16 text

Estructura de un proyecto Django /proyecto/          /proyecto/                  __init__.py                  urls.py                  manage.py                  settings.py          blog/                  __init__.py                models.py                views.py
              urls.py                templates/                static/        foro/                __init__.py                models.py                views.py                urls.py                templates/ Configuración del proyecto Mapeo de URLs global Vistas URLs de la aplicación Modelos de datos Aplicación 1 Aplicación 2

Slide 17

Slide 17 text

Archivos de un proyecto ★ __init__.py 
 Indica a Python que el directorio sea interpretado como un paquete de Python ★ settings.py 
 Contiene la configuración de la aplicación (conexión a bases de datos, aplicaciones instaladas, etc.) ★ manage.py 
 Nos permite ejecutar comandos de Django sobre el proyecto (ej. para crear nuevas aplicaciones) ★ urls.py 
 Contiene los patrones de URLs del proyecto

Slide 18

Slide 18 text

Archivos de una aplicación ★ __init__.py ★ models.py 
 Contiene nuestros modelos de datos ★ views.py 
 Contiene las vistas de la aplicación ★ tests.py 
 Permite que incluyamos tests para la aplicación ★ urls.py
 Es usual añadir un urls.py con las URLs de nuestra aplicación e importarlas en el urls.py del proyecto por motivos de organización.


Slide 19

Slide 19 text

Ensuciémonos las manos

Slide 20

Slide 20 text

Instalar Django Instalamos Django con el comando: 
  pip  install  django

Slide 21

Slide 21 text

Nuestro primer proyecto Django Creamos nuestro proyecto web:
 
 django-­‐admin  startproject  miweb Y nuestra aplicación blog dentro de éste:
 
 cd  miweb   python  manage.py  startapp  blog

Slide 22

Slide 22 text

Arrancamos el servidor de desarrollo Arrancamos el servidor de desarrollo:
 
 python manage.py runserver Y entramos en http://127.0.0.1:8000/ ¡Voila!

Slide 23

Slide 23 text

Activamos nuestra app Añadimos la aplicación al setting INSTALLED_APPS en la configuración del proyecto para activarla:
 
 
 
 
 INSTALLED_APPS  =  (
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'blog',
 )   settings.py

Slide 24

Slide 24 text

Modelos de datos ★ Son clases de Python que heredan de django.db.models.Model ★ Definen la estructura de los datos que se almacenarán en la BD ★ Las tablas, índices, constraints etc. de la base de datos se generan automáticamente a partir de los modelos ★ Un modelo está compuesto de campos. Django tiene distintos tipos de campos para texto, números, ficheros, etc. ★ Cuando nuestros modelos cambian podemos crear migraciones automáticas o personalizarlas

Slide 25

Slide 25 text

from  django.db  import  models
 from  django.contrib.auth.models  import  User
 
 
 class  Category(models.Model):
        title  =  models.CharField(max_length=100)
        slug  =  models.SlugField(max_length=100)
 
      def  __unicode__(self):
                return  self.title
 
 
 class  Post(models.Model):
        title  =  models.CharField(max_length=100)
        slug  =  models.SlugField(max_length=100)
        author  =  models.ForeignKey(User,  related_name='posts')
        content  =  models.TextField()
        created_date  =  models.DateTimeField(auto_now_add=True)
        published_date  =  models.DateField()
        published  =  models.BooleanField(default=True)
 
        class  Meta:
                ordering  =  (‘-­‐published_date',)
 
        def  __unicode__(self):
                return  self.title models.py

Slide 26

Slide 26 text

Sincronizamos la base de datos Creamos la migración inicial para la base de datos: python  manage.py  makemigrations Migrations  for  'blog':
    0001_initial.py:
        -­‐  Create  model  Category
        -­‐  Create  model  Post Se crea un archivo Python de migración con los cambios de modelo:

Slide 27

Slide 27 text

Sincronizamos la base de datos Ejecutamos las migraciones pendientes para crear las tablas y constrains iniciales: python  manage.py  migrate Operations  to  perform:
    Apply  all  migrations:  admin,  blog,  contenttypes,  auth,  sessions
 
 Running  migrations:
    Applying  contenttypes.0001_initial...  OK
    Applying  auth.0001_initial...  OK
    Applying  admin.0001_initial...  OK
    Applying  blog.0001_initial...  OK
    Applying  sessions.0001_initial...  OK

Slide 28

Slide 28 text

SQL generado BEGIN;   CREATE  TABLE  "blog_category"  (
 "id"  integer  NOT  NULL  PRIMARY  KEY  AUTOINCREMENT,
 "title"  varchar(100)  NOT  NULL,
 "slug"  varchar(100)  NOT  NULL);   CREATE  TABLE  "blog_post"  (
 "id"  integer  NOT  NULL  PRIMARY  KEY  AUTOINCREMENT,
 "title"  varchar(100)  NOT  NULL,
 "slug"  varchar(100)  NOT  NULL,
 "content"  text  NOT  NULL,
 "created_date"  datetime  NOT  NULL,
 "published_date"  date  NOT  NULL,
 "published"  bool  NOT  NULL,
 "author_id"  integer  NOT  NULL  REFERENCES  "auth_user"  ("id"));   CREATE  INDEX  "blog_category_2dbcba41"  ON  "blog_category"  ("slug");
 CREATE  INDEX  "blog_post_2dbcba41"  ON  "blog_post"  ("slug");
 CREATE  INDEX  "blog_post_4f331e2f"  ON  "blog_post"  ("author_id");   COMMIT;

Slide 29

Slide 29 text

¿Y si ya tengo una base de datos? Django ofrece un comando para generar las clases Python de los modelos a partir de una base de datos existente mediante introspección: python manage.py inspectdb

Slide 30

Slide 30 text

Creamos un sitio de administración Django incluye un paquete para generar un sitio de administración mediante introspeccción de modelos: django.contrib.admin from  django.contrib  import  admin
 from  .models  import  Category,  Post
 
 class  CategoryAdmin(admin.ModelAdmin):
        list_display  =  ['title',  'slug']
        prepopulated_fields  =  {'slug':('title',)}
 
 admin.site.register(Category,  CategoryAdmin)
 
 
 class  PostAdmin(admin.ModelAdmin):
        list_display  =  ['title',  'category',  'slug',  'author',  'created_date',   'published_date',  'published']
        list_filter  =  ['created_date',  'published_date',  'published',  'category']
        search_fields  =  ['title',  'content']
        prepopulated_fields  =  {'slug':('title',)}
 
 admin.site.register(Post,  PostAdmin) admin.py

Slide 31

Slide 31 text

Creamos un super-usuario Creamos un super-usuario para acceder al sitio de administración: 
 python manage.py createsuperuser Username  (leave  blank  to  use  'zenx'):  admin
 Email  address:  [email protected]
 Password:  
 Password  (again):     Superuser  created  successfully.

Slide 32

Slide 32 text

Accedemos al sitio de administración Entramos en http://127.0.0.1:8000/admin/ y vemos nuestros modelos:

Slide 33

Slide 33 text

Creamos objetos Creamos un post y vemos el listado del posts:

Slide 34

Slide 34 text

Creamos las vistas A from  django.shortcuts  import  render,  get_object_or_404
 from  .models  import  Category,  Post
 
 
 def  post_list(request,  category_slug=None):
        posts  =  Post.objects.filter(published=True)
        if  category_slug:
                #  si  viene  una  categoría  filtramos  por  ella
                category  =  get_object_or_404(Category,  slug=category_slug)
                posts  =  posts.filter(category=category)
        return  render(request,  'blog/post/list.html',  locals())
 
 
 def  post_detail(request,  id,  slug):
        post  =  get_object_or_404(Post,  id=id,  slug=slug,  published=True)
        return  render(request,  'blog/post/detail.html',  {'post':  post}) views.py

Slide 35

Slide 35 text

Añadimos URLs para las vistas from  django.conf.urls  import  patterns,  include,  url
 from  django.contrib  import  admin
 from  .views  import  post_list,  post_detail
 
 
 urlpatterns  =  patterns('',
        url(r'^$',  post_list,  name='post_list'),
        url(r'^(?P[-­‐\w]+)/$',  post_list,  name='post_list_by_category'),
        url(r'^(?P\d+)/(?P[-­‐\w]+)/$',  post_detail,  name='post_detail'),        
 )   urls.py

Slide 36

Slide 36 text

Añadimos nuestras URLs al proyecto from  django.conf.urls  import  patterns,  include,  url
 from  django.contrib  import  admin
 
 
 urlpatterns  =  patterns('',
        url(r'^admin/',  include(admin.site.urls)),
        url(r'^',  include('blog.urls')),
 )   urls.py

Slide 37

Slide 37 text

Creamos una plantilla base {%  load  static  %}
 
 
 
        {%  block  title  %}{%  endblock  %}
        
 
 
 
        

                {%  block  content  %}
                {%  endblock  %}
        

 
   base.html

Slide 38

Slide 38 text

Plantilla de listado de posts A {%  extends  "blog/base.html"  %}
 
 {%  block  title  %}
        {%  if  category  %}{{  category.title  }}{%  else  %}Mi  blog{%  endif  %}
 {%  endblock  %}   {%  block  content  %}
        

{%  if  category  %}Posts  de  {{  category.title  }}{%  else  %}Mi  blog{%  endif  %}


        {%  for  post  in  posts  %}
                

{{  post.title  }}


                


                        Publicado  el  {{  post.published_date|date:"d  \d\e  M.  Y"  }}  por   {{  post.author.name  }}  en  
                        {{  post.category  }}
                


                {{  post.content|truncatewords:30|linebreaks  }}
        {%  endfor  %}
 {%  endblock  %}   post/list.html

Slide 39

Slide 39 text

Plantilla de detalle de post A {%  extends  "blog/base.html"  %}   {%  block  title  %}{{  post.title  }}{%  endblock  %}
 
 {%  block  content  %}
        

{{  post.title  }}


        


                        Publicado  el  {{  post.published_date|date:"d  \d\e  M.  Y"  }}  por   {{  post.author.name  }}  en  
                        {{  post.category  }}
                


        {{  post.content|linebreaks  }}
 {%  endblock  %}   post/detail.html

Slide 40

Slide 40 text

¡Nuestro primer blog con Django!

Slide 41

Slide 41 text

No content