"El Web Framework para perfeccionistas"
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
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
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?
“Esto seguro es mentira, en situaciones mas complejas seguro ya no se puede usar”
“Simple no significa limitado, sino bien diseñado.”