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