Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Introducción a Django

Introducción a Django

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

Paradigma

March 16, 2015
Tweet

More Decks by Paradigma

Other Decks in Programming

Transcript

  1. View Slide

  2. ¿Django?

    View Slide

  3. Django!
    Un framework web de alto nivel escrito en Python
    que fomenta el desarrollo rápido y limpio 

    y el diseño pragmático.

    View Slide

  4. Django
    Reinhardt
    Nombrado en honor a

    View Slide

  5. ¿Quién usa Django?

    View Slide

  6. Django en
    SecurityHub

    View Slide

  7. ★ 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

    View Slide

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

    View Slide

  9. Django sigue el principio

    View Slide

  10. 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

    View Slide

  11. ¿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.

    View Slide

  12. Django es modular

    View Slide

  13. 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.

    View Slide

  14. 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)

    View Slide

  15. 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

    View Slide

  16. 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

    View Slide

  17. 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

    View Slide

  18. 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.


    View Slide

  19. Ensuciémonos las manos

    View Slide

  20. Instalar Django
    Instalamos Django con el comando:

     pip  install  django

    View Slide

  21. 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

    View Slide

  22. Arrancamos el servidor de desarrollo
    Arrancamos el servidor de desarrollo:


    python manage.py runserver
    Y entramos en http://127.0.0.1:8000/ ¡Voila!

    View Slide

  23. 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

    View Slide

  24. 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

    View Slide

  25. 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

    View Slide

  26. 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:

    View Slide

  27. 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

    View Slide

  28. 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;

    View Slide

  29. ¿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

    View Slide

  30. 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

    View Slide

  31. 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.

    View Slide

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

    View Slide

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

    View Slide

  34. 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

    View Slide

  35. 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

    View Slide

  36. 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

    View Slide

  37. Creamos una plantilla base
    {%  load  static  %}




           {%  block  title  %}{%  endblock  %}

           




           

                   {%  block  content  %}

                   {%  endblock  %}

           


     
    base.html

    View Slide

  38. 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  }}
    a>

                   

                           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

    View Slide

  39. 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

    View Slide

  40. ¡Nuestro primer blog con Django!

    View Slide

  41. View Slide