DJANGO
"El Web Framework para perfeccionistas"
Django
Django es un framework web de código abierto escrito en Python que permite construir aplicaciones web más rápido y con menos código.
Django fue inicialmente desarrollado para gestionar aplicaciones web de páginas orientadas a noticias de World Online, más tarde se liberó bajo licencia BSD. Django se centra en automatizar todo lo posible y se adhiere al principio DRY(Don't Repeat Yourself).
El sitio web oficial en inglés es https://www.djangoproject.com/
Pero...
¿Por qué Django?
PYTHON
Python es un lenguaje de programación interpretado cuya filosofía hace hincapié en una sintaxis que favorezca un código legible. Es multiplataforma y multiparadigma
Ventajas
- Legible: sintaxis intuitiva y estricta
- Productivo: ahorra mucho código.
- Portable: para todo sistema operativo.
- Recargado: viene con muchas librerías por defecto.
Primeros Pasos Con Python
VARIABLES
Las variables en python no necesitan ser definidas ni tampoco su tipo de dato a diferencia de otros lenguajes de programación
A=3
B=A
FUNCIONES
Las funciones en python son definidas con def junto a un nombre y los parametros que utilizaras terminando con dos puntos. Luego adentro de la función de forma identada ejecutas las operacion.
def my_first_function():
return "Python rules"
my_first_function()
LISTAS
Las listas son estructuras de datos que se encargan de almacenar y ordenar elementos, las listas son del tipo mutable y pueden manejar varios tipos de datos a la vez.
lista = [1, True, "Awante Táchira", [1,2,3,5,6,7]]
TUPLAS
Tienen el mismo formato de las listas pero a diferencia de ellas, las tuplas son inmutables.
tupla = (1, True, "Awante Táchira")
CICLO FOR
for i in lista:
print i
>> 1, True, "Awante Táchira", [1,2,3]
for i in range(4):
print i
>> 1, 2, 3, 4
DICCIONARIOS
En los diccionarios tienes un grupo de datos con un formato: la primera cadena o número será la clave para acceder al segundo dato, el segundo dato será el dato al cual accederás con la llave.
D = { "Framework": "Django" , "Descripcion": "The Best Framework", "Lenguaje": Python }
print D["Framework"]
>> Django
CLASES
Para definir la clase usas class y el nombre. En caso de tener parámetros los pones entre paréntesis.
Para crear un constructor haces una función dentro de la clase con el nombre __init__ y de parámetros self (significa su clase misma).
class Frameworks(object):
def __init__ (self, framework, lenguaje):
self.framework = framework
self.lenguaje= lenguaje
def info(self):
return "Uso %s que está escrito en %s" % (self.framework, self.lenguaje)
persona = Perfil("Django", "Python")
print persona.info()
>> Uso Django que está escrito en Python
Mi Primera app en Django
Lo primero que debemos tener instalado es pip
$ wget https://bootstrap.pypa.io/get-pip.py
$ python get-pip.py
Luego instalamos virtualenv
$ pip install virtualenv
$ virtualenv venv
$ source venv/bin/activate
Ya adentro de nuestro entorno virtual instalamos Django y creamos nuestro projecto
(venv) $ pip install django
(venv) $ django-admin.py startproject blog
Así quedaría nuestra estructura
.
├── blog
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── manage.py
Ejecutamos el servidor de desarrollo
(venv) $ python manage.py runserver
Creamos nuestra app
(venv) $ python manage.py startapp app
.
├── app
│ ├── admin.py
│ ├── __init__.py
│ ├── migrations
│ │ └── __init__.py
│ ├── models.py
│ ├── tests.py
│ └── views.py
├── blog
│ ├── __init__.py
│ ├── __init__.pyc
│ ├── settings.py
│ ├── settings.pyc
│ ├── urls.py
│ └── wsgi.py
└── manage.py
Entonces podemos decir que el flujo de trabajo de Django es el siguiente
Creando Los Modelos
from django.db import models
from django.template.defaultfilters import slugify
# Create your models here.
class Post(models.Model):
titulo = models.CharField(max_length=150)
contenido = models.TextField()
slugUrl = models.SlugField(max_length=255, blank=True, default="" )
def save(self, *args, **kwargs):
if not self.id:
self.slugUrl = slugify(self.titulo)
super(Post, self).save(*args, **kwargs)
def __str__(self):
return self.titulo
models.py
Y en el admin.py
from django.contrib import admin
from .models import Post
# Register your models here.
admin.site.register(Post)
MIGRACIONES
$ python manage.py makemigrations app
$ python manage.py migrate app
$ python manage.py syncdb
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
]
operations = [
migrations.CreateModel(
name='Post',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('titulo', models.CharField(max_length=150)),
('contenido', models.TextField()),
],
options={
},
bases=(models.Model,),
),
]
urls.py
from django.conf.urls import patterns, include, url
from django.contrib import admin
urlpatterns = patterns('',
# Examples:
# url(r'^$', 'blog.views.home', name='home'),
# url(r'^blog/', include('blog.urls')),
url(r'^admin/', include(admin.site.urls)),
)
Vistas y ORM
from django.shortcuts import render, get_object_or_404
from app.models import Post
# Create your views here.
def posts(request):
posts = Post.objects.all()
template = "posts.html"
return render(request,template,locals())
def postdetail(request, slugUrl):
post = get_object_or_404(Post, slugUrl = slugUrl)
template = "post.html"
return render(request,template,locals())
urls.py
from django.conf.urls import patterns, include, url
from django.contrib import admin
urlpatterns = patterns('',
url(r'^$', 'app.views.posts', name='posts'),
url(r'^blog/([^/]+)$', 'app.views.postdetail', name ='postdetail'),
url(r'^admin/', include(admin.site.urls)),
)
TEMPLATES
posts.html y post.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
{% for post in posts %}
<div class="">
<h1>{{post.titulo}}</h1>
<p>{{post.contenido}}</p>
<a href="blog/{{post.slugUrl}}">Ver detalladamente</a>
</div>
{% endfor %}
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div class="">
<h1>{{post.titulo}}</h1>
<p>{{post.contenido}}</p>
</div>
</body>
</html>
settings.py
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.7/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '6=q-u$ys-x&m_lr!-7k2b_ew9@na*xdflbmaikdh-(mu81l+%+'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
TEMPLATE_DEBUG = True
ALLOWED_HOSTS = []
# Application definition
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app',
)
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
)
ROOT_URLCONF = 'blog.urls'
WSGI_APPLICATION = 'blog.wsgi.application'
# Database
# https://docs.djangoproject.com/en/1.7/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
AJA PERO Y ENTONCES
¿POR QUÉ DJANGO?
- Python
- ORM
- ADMIN
- DRY
“Esto seguro es mentira, en situaciones mas complejas seguro ya no se puede usar”
“Simple no significa limitado, sino bien diseñado.”
Django Slides
By Henry Bravo
Django Slides
Web Framework
- 580