introducción a django

41

Upload: paradigma-tecnologico

Post on 16-Jul-2015

218 views

Category:

Science


1 download

TRANSCRIPT

Page 1: Introducción a Django
Page 2: Introducción a Django

¿Django?

Page 3: Introducción a Django

Django!

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

y el diseño pragmático.

Page 4: Introducción a Django

Django Reinhardt

Nombrado en honor a

Page 5: Introducción a Django

¿Quién usa Django?

Page 6: Introducción a Django

Django en

SecurityHub

Page 7: Introducción a Django

★ 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

Page 8: Introducción a Django

En la redacción de World Online para crear aplicaciones web rápidamente con fechas ajustadas

Nace en un entorno periodístico

Page 9: Introducción a Django

Django sigue el principio

Page 10: Introducción a Django

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

Page 11: Introducción a Django

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

Page 12: Introducción a Django

Django es modular

Page 13: Introducción a Django

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.

Page 14: Introducción a Django

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)

Page 15: Introducción a Django

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

Page 16: Introducción a Django

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

VistasURLs de la aplicación

Modelos de datosAplicación 1

Aplicación 2

Page 17: Introducción a Django

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

Page 18: Introducción a Django

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

Page 19: Introducción a Django

Ensuciémonos las manos

Page 20: Introducción a Django

Instalar Django

Instalamos Django con el comando:

 pip  install  django

Page 21: Introducción a Django

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

Page 22: Introducción a Django

Arrancamos el servidor de desarrollo

Arrancamos el servidor de desarrollo: python manage.py runserver

Y entramos en http://127.0.0.1:8000/ ¡Voila!

Page 23: Introducción a Django

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

Page 24: Introducción a Django

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

Page 25: Introducción a Django

from  django.db  import  modelsfrom  django.contrib.auth.models  import  Userclass  Category(models.Model):        title  =  models.CharField(max_length=100)        slug  =  models.SlugField(max_length=100)      def  __unicode__(self):                return  self.titleclass  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

Page 26: Introducción a Django

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:

Page 27: Introducción a Django

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,  sessionsRunning  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

Page 28: Introducción a Django

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;

Page 29: Introducción a Django

¿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

Page 30: Introducción a Django

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  adminfrom  .models  import  Category,  Postclass  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

Page 31: Introducción a Django

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.

Page 32: Introducción a Django

Accedemos al sitio de administración

Entramos en http://127.0.0.1:8000/admin/ y vemos nuestros modelos:

Page 33: Introducción a Django

Creamos objetos

Creamos un post y vemos el listado del posts:

Page 34: Introducción a Django

Creamos las vistas

Afrom  django.shortcuts  import  render,  get_object_or_404from  .models  import  Category,  Postdef  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

Page 35: Introducción a Django

Añadimos URLs para las vistas

from  django.conf.urls  import  patterns,  include,  urlfrom  django.contrib  import  adminfrom  .views  import  post_list,  post_detailurlpatterns  =  patterns('',        url(r'^$',  post_list,  name='post_list'),        url(r'^(?P<category_slug>[-­‐\w]+)/$',  post_list,  name='post_list_by_category'),        url(r'^(?P<id>\d+)/(?P<slug>[-­‐\w]+)/$',  post_detail,  name='post_detail'),        )  

urls.py

Page 36: Introducción a Django

Añadimos nuestras URLs al proyecto

from  django.conf.urls  import  patterns,  include,  url from  django.contrib  import  adminurlpatterns  =  patterns('',        url(r'^admin/',  include(admin.site.urls)),        url(r'^',  include('blog.urls')),)  

urls.py

Page 37: Introducción a Django

Creamos una plantilla base

{%  load  static  %}<!DOCTYPE  html><html><head>        <title>{%  block  title  %}{%  endblock  %}</title>        <link  href="{%  static  "css/blog.css"  %}"  rel="stylesheet"></head><body>        <div  class="content">                {%  block  content  %}                {%  endblock  %}        </div></body></html>  

base.html

Page 38: Introducción a Django

Plantilla de listado de posts

A{%  extends  "blog/base.html"  %}{%  block  title  %}        {%  if  category  %}{{  category.title  }}{%  else  %}Mi  blog{%  endif  %}{%  endblock  %}  

{%  block  content  %}        <h1>{%  if  category  %}Posts  de  {{  category.title  }}{%  else  %}Mi  blog{%  endif  %}</h1>        {%  for  post  in  posts  %}                <h2><a  href="{%  url  "blog:post_detail"  post.id  post.slug  %}">{{  post.title  }}</a></h2>                <p  class="date">                        Publicado  el  {{  post.published_date|date:"d  \d\e  M.  Y"  }}  por  {{  post.author.name  }}  en                          <a  href="{%  url  "blog:post_list_by_category"  post.category.slug  %}">{{  post.category  }}</a>                </p>                {{  post.content|truncatewords:30|linebreaks  }}        {%  endfor  %}{%  endblock  %}  

post/list.html

Page 39: Introducción a Django

Plantilla de detalle de post

A{%  extends  "blog/base.html"  %}  

{%  block  title  %}{{  post.title  }}{%  endblock  %}{%  block  content  %}        <h1>{{  post.title  }}</h1>        <p  class="date">                        Publicado  el  {{  post.published_date|date:"d  \d\e  M.  Y"  }}  por  {{  post.author.name  }}  en                          <a  href="{%  url  "blog:post_list_by_category"  post.category.slug  %}">{{  post.category  }}</a>                </p>        {{  post.content|linebreaks  }}{%  endblock  %}  

post/detail.html

Page 40: Introducción a Django

¡Nuestro primer blog con Django!

Page 41: Introducción a Django