Programacion en Python 7
Programacion en Python 7
Protocolo HTTP:
Requerimiento
Respuesta
Lenguaje HTML, CSS
Cookies, cache, sesiones, URL
Servidor Web (interfaces, sistemas operativos)
Browsers (capacidades, compatibilidad, etc.)
Tcnicas avanzadas:
Javascript: ajax, comet, etc.
Java Applets, Flash, Silverlight
Historia del desarrollo Web
HTML estticas
CGI: cdigo para generar pginas web dinmicas:
Perl
Python (import cgi !)
Cdigo embebido en pginas web:
PHP, JSP, ASP
PSP (python server pages)
Frameworks web: tercera generacin
RoR, Struts, Symphony
Django, TurboGears, Web2Py
Modularidad, Reutilizacin, Extensibilidad, Seguridad
Ejemplo CGI
#!/usr/bin/python
import MySQLdb
print "Content-Type: text/html\n" # codigo repetitivo trivial
print "<html><head><title>Libros</title></head><body>"
print "<h1>Los ultimos 10 libros</h1><ul>" # html embebido
conexion = MySQLdb.connect(user='yo', passwd='dejame_entrar',
db='mi_base') # codigo duplicado en varios scripts, sin configuracin
cursor = conexion.cursor()
cursor.execute("SELECT nombre FROM libros ORDER BY fecha_pub
DESC LIMIT 10")
for fila in cursor.fetchall():
print "<li> %s</li>" % fila[0]
print "</ul></body></html>"
conexion.close()
Patrn MVC:
Patron de arquitectura de software
Separar Capas:
Datos (Model)
Presentacin (View)
Lgica de Control (Controller)
Patrn MVC: Modelo
def latest_books(request):
book_list = Book.objects.order_by('-pub_date')[:10]
return render_to_response('latest_books.html',
{'book_list': book_list})
Django: plantillas ("vistas")
Easy_install:
easy_install django
Cdigo fuente
1. Baja el tarball, que se llamar algo as como
Django-0.96.tar.gz
2. tar xzvf Django-*.tar.gz
3. cd Django-*
4. sudo python setup.py install
Django: Comprobacin
Iniciar Python:
Temas de despliegue:
Hosting compartido, verificar versin
Incluir django con el proyecto
Opciones:
PostgreSQL (recomendado): PsycoPg y Windows
MySQL: MySQLDb
SqLite (para dearrollo, proyectos chicos)
No usar base de datos! (algunas herramientas
extras no estarn disponibles)
Django: Comenzar un proyecto
Estructura misito/:
__init__.py: declara el paquete
manage.py: utilitario para administrar
settings.py: opciones / configuraciones
urls.py: "tabla de contenidos" segn URLs
Validating models...
0 errors found
Django version 1.1, using settings 'misitio.settings'
Development server is running at http://127.0.0.1:
8000/
Quit the server with CTRL-BREAK.
Django: Pgina de bienvenida
It worked!
Congratulations on your first Django-powered page.
Of course, you haven't actually done any work yet. Here's what to do next:
If you plan to use a database, edit the DATABASE_* settings in misitio/settings.py.
Start your first app by running python misitio/manage.py startapp [appname].
You're seeing this message because you have DEBUG = True in your Django settings file and you
haven't configured any URLs. Get to work!
Django: Servidor de desarrollo
Validating models...
0 errors found
Django version 1.1, using settings 'misitio.settings'
Development server is running at http://127.0.0.1:
8000/
Quit the server with CTRL-BREAK.
Django: Vista dinmica
urlpatterns = patterns('',
(r'^fecha/$', fecha_actual),
)
Probar http://localhost:8000/fecha
Django: URL "dinmicas"
Filosofa:
Separar lgica negocios de lgica presentacin
Sintxis independiente HTML/XML (ej texto)
Editar cdigo HTML directamente (!wyswyg)
Diseadores != Programadores (no python!)
No inventar un lenguaje de programacin
Limitaciones:
No asignar variables ni modificarlas
No llamar a cdigo python crudo
Django: Plantillas: variables
{% extends "base.html" %}
{% block nombre %}Texto reemplazado{ %
endblock %} redefine el bloque title de base.html
Django: Plantillas por cdigo
C:\...>python manage.py shell
>>> from django.template import Template, Context
>>> raw_template = """<p>Estimado {{ nombre }},</p>
... <p>Gracias por pedir {{ producto }} de {{ compania }}.
... Se envia el {{ envio|date:"F j, Y" }}.</p>
... {% if garantia %} <p>Garantia sera incluida </p>{% endif %}"""
>>> t = Template(raw_template)
>>> import datetime
>>> c = Context({'nombre': 'Juan Perez', 'producto': 'Notebook',
... 'compania': 'CompuVentas', 'envio': datetime.date(2009, 4, 2),
... 'garantia': True})
>>> t.render(c)
u'<p>Estimado Juan Perez,</p>\n <p>Gracias por pedir Notebook de
CompuVentas. Se envia el April 2, 2009.</p>\n <p>La garantia sera
i
ncluida en el pedido.</p>\n</p>'
Django: Plantillas desde archivo
import os
curdir = os.path.dirname(__file__)
ruta = os.path.join(curdir, 'templates').replace('\\','/')
TEMPLATE_DIRS = (
ruta, # indicar el path completo de las plantillas
)
Django: Plantillas en vistas
Editar views.py:
def fecha_actual(request):
ahora = datetime.datetime.now()
return render_to_response('fecha.html', {'fecha':
ahora})
Django: Plantillas en vistas
Editar templates/base.html:
<html><head>
<title>{% block title %}{% endblock %}</title>
</head><body><h1>Sitio de prueba</h1>
{% block content %}{% endblock %}
{% block footer %}<hr>Gracias{% endblock %}
</body></html>
Editar templates/fecha.html:
{% extends "base.html" %}
{% block title %}Fecha Actual{% endblock %}
{% block content %}<p>Ahora es {{ fecha }}.</p>
{% endblock %}
Django: Aplicaciones
Estructura msitio/libreria:
models.py: modelos
tests.py: pruebas
views.py: vistas
__init__.py: mdulo python
Django: Aplicaciones: configuracin
Modificar settings.py:
# Agregar la aplicacion
INSTALLED_APPS = (
'misitio.libros',
)
Django: Modelo: definicin
Agregar clases a libros/models.py:
class Editorial(models.Model):
nombre = models.CharField(maxlength=30)
website = models.URLField()
class Autor(models.Model):
nombre = models.CharField(maxlength=10)
email = models.EmailField()
foto = models.ImageField(upload_to='/tmp')
class Book(models.Model):
titulo = models.CharField(maxlength=100)
autores = models.ManyToManyField(Autor)
editorial = models.ForeignKey(Editorial)
fecha = models.DateField()
tapa = models.ImageField(upload_to='/tmp',null=True)
Django: Modelo: sincronizar la base
Para crear las tablas ejecutar:
python manage.py syncdb
Util para:
Consultar el esquema SQL
Modificar el esquema SQL
Django: Modelo: insertar datos
Ingresar al interprete dentro del sitio:
python manage.py shell
>>> Editorial.objects.filter(website__contains="www")
[<Editorial: Addison-Wesley>, <Editorial: O'Reilly>]
>>> Editorial.objects.order_by("-nombre","website")
[<Editorial: O'Reilly>, <Editorial: Apress>, <Editorial:
Addison-Wesley>]
>>> Editorial.objects.filter(website__contains="a").order_by("-
nombre")
[<Editorial: Apress>, <Editorial: Addison-Wesley>]
>>> e = Editorial.objects.get(nombre="Addison-Wesley")
>>> e.delete()
>>> Editorial.objects.all()
[<Editorial: O'Reilly>, <Editorial: Apress>]
Probar http://localhost:8000/admin
Django: Admin: agregar nuestra app
Crear libreria/admin.py:
admin.site.register(Libro)
admin.site.register(Editorial)
admin.site.register(Autor)
Reiniciar el servidor!
Django: Admin: Indice
Ingresar a http://localhost:8000/admin/
Aplicaciones,
Objetos / Acciones
Django: Admin: Editando un objeto
Django: Formularios
Crear libreria/foms.py:
admin.site.register(Libro)
admin.site.register(Editorial)
admin.site.register(Autor)
Reiniciar el servidor!
Django: Formularios
Crear libreria/foms.py:
from django import forms
class BusquedaForm(forms.Form):
texto = forms.CharField(max_length=100, required=True)
Crear templates/busqueda.html:
<form action="/libreria/buscar/" method="post">
<label for="id_texto">Texto</label>
{{ form.texto }} {{ form.texto.errors }}<br/>
<input type="submit" value="Buscar" /> </form>
Ventajas:
Validacin (por campo y por formulario)
Conversin tipos de datos
Manejo de errores y widgets html
Django: Formularios (vista)
Agregar la vista libreria/views.py:
from libreria.forms import BusquedaForm
def buscar(request):
if request.method == 'POST': # si enviaron...
form = BusquedaForm(request.POST) # creo el form
if form.is_valid(): # pasaron las validaciones?
texto = form.cleaned_data['texto']
libros = Libro.objects.filter(titulo__contains=texto)
return render_to_response('busqueda.html', {
'texto': texto, 'libros': libros })
else:
form = BusquedaForm() # An unbound form
return render_to_response('buscar.html', {'form': form,})
Django: Formulario (plantilla resultados)
Agregar la plantilla templates/busqueda.py:
<ul>
{% for libro in libros %}
<li><b><a href="{{ libro.tapa.url }}">{{ libro.titulo }}
</a></b>:
{% for autor in libro.autores.all %} {{ autor.nombre }},
{% endfor %}
{{ libro.editorial.nombre }}, <i>{{libro.fecha}}</i>
{% endfor %}
</ul>
Django: Servir contenidos estticos*
Modificar settings.py:
Modificar urls.py:
urlpatterns = patterns('',
(r'^static/(?P<path>.*)$', 'django.views.static.serve',
{'document_root': settings.MEDIA_ROOT}),
)
Django: flatpages: pginas "estticas"
Funcionamiento:
Funcionan ante errores 404 (pgina no encontrada)
Muestran contenido html "esttico"
Creadas por la interfaz admin o por cdigo
Permiten elegir la plantillas, por defecto
tempates/flatpages/default.html:
<html><head><title>{{ flatpage.title }}</title></head>
<body>
{{ flatpage.content }}
</body>
</html>
Django: flatpages: instalacin
Agregar app y middleware en settings.py:
INSTALLED_APPS = (
'django.contrib.flatpages',
)
MIDDLEWARE_CLASSES = (
'django.contrib.flatpages.middleware.
FlatpageFallbackMiddleware',
)
Actualizar la base de datos:
C:>python manage.py syncdb
Creating table django_flatpage
Installing index for flatpages.FlatPage model
Crear plantilla templates/flatpages/default.html
Crear pginas en el admin
Django: flatpages: ejemplo
Documentacin y Ayuda
Django: http://www.djangoproject.com/
Django en espaol: http://django.es/
Libro Django en espaol (traduccin)
Wiki Python:
Plantillas
Mdulos ltiles (incluye desarrollo web)
Python Argentina: http://www.python.org.ar/