Luis Cruz            @7Talks@lcruzc
CTO & Co-founder  Experimento Social
Python
Python• Lenguaje dinámico• Fuertemente tipado• Código abierto y multiplataforma• Archivos extensión .py
SintaxisNo utiliza estructuras del tipo “{ ... } “ paradefinir bloques, sino que utiliza identaciónif a == 1:    print “Alg...
Tipos de datosLos típicos string, int, float, long,bool>>> 1 + 23>>> 1 + 212>>> 1 + 2Traceback (most recent call last):  Fi...
Cosas InteresantesSwap>>> a = 2>>> b = 3>>> a, b = b, ay con split...>>> year, month, day = "2011-12-01".split("-")
Cosas InteresantesManera tradicionalif (a == b) {    c = x} else {    c = y}the python way..c = x if a == b else y
Cosas Interesantes        ¿Números entre 0 y 15 que sean            divisibles por 1 o 5?>>> a = [i for i in range(15) if ...
Cosas Interesantes   “Generadores”Generadoresdef date_range(start, end):    for n in range((end-start).days):        yield...
Cosas Interesantes  “Decoradores”Caso:def hacer_algo():    print "algo"hacer_algo()Caso con Logs:def hacer_algo_con_logs()...
Cosas Interesantes “Decoradores”Implementar un decoradordef log_decorator(f):    def wrapper():        print "inicio"     ...
Primeros Pasos
Python Shelldevelop$ pythonPython 2.6.7 (r267:88850, Aug 22 2011, 18:14:53)[GCC 4.2.1 (Based on Apple Inc. build 5658)(LLV...
Python Shell>>> range(1,10)[1, 2, 3, 4, 5, 6, 7, 8, 9]>>> from djangolab.myapp.models import MyModel>>> import __hello__>>...
VirtualEnv
VirtualEnvDescargarhttp://pypi.python.org/pypi/virtualenvInstalarpython setup.py install
Comandos basicos de    virtualenvCreando una ambientelabs$ virtualenv WS_ENVNew python executable in WS_ENV/bin/pythonInst...
DJango
Caracteristicas• Don’t Repeat Yourself• Estructura de trabajo MTV• URL amigables• Sistema de admistración• Plantillas• Sop...
Flujo   Request Enrutamiento    Vista    HTML  Response
InstalaciónCon virtualenvmyambiente/bin/pip install django
Organización
Organización- proyecto  - aplicación 1     - views.py     - models.py  - aplicación 2     - views.py     - models.py  - ap...
Archivos del Proyecto• settings.py: almacena los parametros de  configuración de la aplicación• urls.py: almacena los ruteo...
Archivos de la         Aplicación• models.py: modelos propios de la  aplicación• views.py: vistas (controladores)• tests.p...
Creando una Aplicación
Creando un proyectoCrear un proyectoworkshop$ django-admin.py startproject labdjangoCrear un aplicaciónlabdjango$ python m...
Configurando la base     de datosDATABASES = {    default: {        ENGINE: django.db.backends.sqlite3,        NAME: databa...
Ejecutando el servidorlabdjango$ python manage.py runserverValidating models...0 errors foundDjango version 1.3, using set...
Corriendo la aplicación
Persistencia
Creando un modelofrom django.db import modelsclass Noticia(models.Model):    fecha = models.DateField(null=True)    catego...
Sincoronizando con    nuestra base de datoslabdjango$ python manage.py syncdbCreating tables ...You just installed Djangos...
ORM ILlamado al nuestro shell bajo “django”workshop$ python manage.py shellObteniendo los objetos>> Categoria.objects.all(...
ORM IIRecuperando un objeto>> categoria = Categoria.objects.get(pk=1)Recuperando un objeto>> categoria = Categoria.objects...
ORM IIIRecuperando un objeto (join)>> Noticia.objects.filter(categoria__nombre   = Deportes)Recuperando objetos relacionad...
Enrutamiento y Vistas
Configurando mis               ruteosurlpatterns = patterns(,    (r^articles/2003/$, ),    (r^/$, myapp.views.index),    (r...
Configurando mis                 ruteosfrom django.shortcuts import renderfrom labdjango.myapp.models import Categoria, Not...
Plantillas
Plantillas I <div class="row">! ! {% for noticia in noticias %}        <div class="span5">          <h2>{{noticia.titulo}}...
Plantillas II{% extends "base.html" %}{% block "content" %}<div class="row">! <div class="span12">! ! <h2>{{noticia.titulo...
Administrador
Administrador
Registrando mis          modelosfrom labdjango.myapp.models import Region, Sucursaladmin.site.register(Region)admin.site.r...
Registrando mis          modelosINSTALLED_APPS = (    django.contrib.auth,    django.contrib.contenttypes,    django.contr...
Registrando mis          modelosfrom django.conf.urls.defaults import patterns,include, urlfrom django.contrib import admi...
Administrador muy     configurableclass NoticiaAdmin(admin.ModelAdmin):! search_fields = [titulo, detalle]! list_filter = (...
Forms
Forms Ifrom django import formsclass ContactoForm(forms.Form):    asunto = forms.CharField(max_length=100)    mensaje = fo...
Forms IIdef contacto(request):    if request.method == POST:        form = ContactoForm(request.POST)        if form.is_va...
Forms III<div class="row">! <form action="/contacto/" method="post">{% csrf_token %}! {{ form.as_p }}! <input type="submit...
Vistas Genéricas
direct_to_templatefrom django.views.generic.simple import direct_to_template...(r^gracias/$, direct_to_template,     {temp...
list_detail.object_list(r^ultimas/$, list_detail.object_list, rule_info),rule_info = {    queryset: Noticia.objects.order_...
FinLuis Cruz@lcruzc
Upcoming SlideShare
Loading in...5
×

Introducción a DJango

613

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
613
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
13
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Introducción a DJango

    1. 1. Luis Cruz @7Talks@lcruzc
    2. 2. CTO & Co-founder Experimento Social
    3. 3. Python
    4. 4. Python• Lenguaje dinámico• Fuertemente tipado• Código abierto y multiplataforma• Archivos extensión .py
    5. 5. SintaxisNo utiliza estructuras del tipo “{ ... } “ paradefinir bloques, sino que utiliza identaciónif a == 1: print “Algo”print “Algo mas”if a == 1: print “Algo” print “Algo mas”for a in arr: print “Otra cosa”def myfunc(): return “y aún más”
    6. 6. Tipos de datosLos típicos string, int, float, long,bool>>> 1 + 23>>> 1 + 212>>> 1 + 2Traceback (most recent call last): File "<stdin>", line 1, in <module>TypeError: cannot concatenate str and intobjects
    7. 7. Cosas InteresantesSwap>>> a = 2>>> b = 3>>> a, b = b, ay con split...>>> year, month, day = "2011-12-01".split("-")
    8. 8. Cosas InteresantesManera tradicionalif (a == b) { c = x} else { c = y}the python way..c = x if a == b else y
    9. 9. Cosas Interesantes ¿Números entre 0 y 15 que sean divisibles por 1 o 5?>>> a = [i for i in range(15) if not (i%3 and i%5)]>>> a[0, 3, 5, 6, 9, 10, 12]filter(lambda x:not (x%5 and x%3), range(15))
    10. 10. Cosas Interesantes “Generadores”Generadoresdef date_range(start, end): for n in range((end-start).days): yield start + datetime.timedelta(n)Usostart = datetime.datetime(2011, 01, 1)end = datetime.datetime(2011, 01, 15)for date in date_range(start, end): print date
    11. 11. Cosas Interesantes “Decoradores”Caso:def hacer_algo(): print "algo"hacer_algo()Caso con Logs:def hacer_algo_con_logs(): print "inicio" hacer_algo() print "end"hacer_algo_con_logs()
    12. 12. Cosas Interesantes “Decoradores”Implementar un decoradordef log_decorator(f): def wrapper(): print "inicio" f() print "end" return wrapperMucho más elegante@log_decoratordef hacer_algo(): print "algo"hacer_algo()
    13. 13. Primeros Pasos
    14. 14. Python Shelldevelop$ pythonPython 2.6.7 (r267:88850, Aug 22 2011, 18:14:53)[GCC 4.2.1 (Based on Apple Inc. build 5658)(LLVM build 2335.15.00)] on darwinType "help", "copyright", "credits" or "license"for more information.>>>
    15. 15. Python Shell>>> range(1,10)[1, 2, 3, 4, 5, 6, 7, 8, 9]>>> from djangolab.myapp.models import MyModel>>> import __hello__>>> import this
    16. 16. VirtualEnv
    17. 17. VirtualEnvDescargarhttp://pypi.python.org/pypi/virtualenvInstalarpython setup.py install
    18. 18. Comandos basicos de virtualenvCreando una ambientelabs$ virtualenv WS_ENVNew python executable in WS_ENV/bin/pythonInstalling setuptools............done.Installing pip...............doneActivando un ambientesource WS_ENV/bin/activateDesactivando un ambientedeactivate
    19. 19. DJango
    20. 20. Caracteristicas• Don’t Repeat Yourself• Estructura de trabajo MTV• URL amigables• Sistema de admistración• Plantillas• Soprte GIS
    21. 21. Flujo Request Enrutamiento Vista HTML Response
    22. 22. InstalaciónCon virtualenvmyambiente/bin/pip install django
    23. 23. Organización
    24. 24. Organización- proyecto - aplicación 1 - views.py - models.py - aplicación 2 - views.py - models.py - aplicación 3 - views.py - models.py - settings.py - urls.py
    25. 25. Archivos del Proyecto• settings.py: almacena los parametros de configuración de la aplicación• urls.py: almacena los ruteos• manage.py: comandos y utilidades para ejecutar sobre el proyecto
    26. 26. Archivos de la Aplicación• models.py: modelos propios de la aplicación• views.py: vistas (controladores)• tests.py: aquí se incluyen nuestros tests o
    27. 27. Creando una Aplicación
    28. 28. Creando un proyectoCrear un proyectoworkshop$ django-admin.py startproject labdjangoCrear un aplicaciónlabdjango$ python manage.py startapp myapp
    29. 29. Configurando la base de datosDATABASES = { default: { ENGINE: django.db.backends.sqlite3, NAME: database.db, USER: , PASSWORD: , HOST: , PORT: , }}
    30. 30. Ejecutando el servidorlabdjango$ python manage.py runserverValidating models...0 errors foundDjango version 1.3, using settings labdjango.settingsDevelopment server is running at http://127.0.0.1:8000/Quit the server with CONTROL-C.[17/Nov/2011 20:11:31] "GET / HTTP/1.1" 200 2057
    31. 31. Corriendo la aplicación
    32. 32. Persistencia
    33. 33. Creando un modelofrom django.db import modelsclass Noticia(models.Model): fecha = models.DateField(null=True) categoria = models.ForeignKey(Categoria) titulo = models.CharField(max_length=100, blank=True) detalle = models.TextField(max_length=100)
    34. 34. Sincoronizando con nuestra base de datoslabdjango$ python manage.py syncdbCreating tables ...You just installed Djangos auth system, which means youdont have any superusers defined.Would you like to create one now? (yes/no): yesUsername (Leave blank to use lcruzc): adminE-mail address: lcruzc@gmail.comPassword:Password (again):Superuser created successfully.Installing custom SQL ...Installing indexes ...No fixtures found.
    35. 35. ORM ILlamado al nuestro shell bajo “django”workshop$ python manage.py shellObteniendo los objetos>> Categoria.objects.all()Creando un objeto>> categoria = Categoria(nombre = ‘Deportes’)>> categoria.save()
    36. 36. ORM IIRecuperando un objeto>> categoria = Categoria.objects.get(pk=1)Recuperando un objeto>> categoria = Categoria.objects.get(nombre=‘Deportes’)Buscando un conjunto de objetos>> noticias = noticia.objects.filter(estado = Publicada)
    37. 37. ORM IIIRecuperando un objeto (join)>> Noticia.objects.filter(categoria__nombre = Deportes)Recuperando objetos relacionados>> categoria = Categoria.objects.get(pk=1)>> categoria.noticia_set.all()[<Noticia: Ganamos la copa america>]Borrando>> categoria.delete()
    38. 38. Enrutamiento y Vistas
    39. 39. Configurando mis ruteosurlpatterns = patterns(, (r^articles/2003/$, ), (r^/$, myapp.views.index), (r^noticias/$, myapp.views.listado), (r^noticia/(?P<id>d+)/$, myapp.views.detalle),)
    40. 40. Configurando mis ruteosfrom django.shortcuts import renderfrom labdjango.myapp.models import Categoria, Noticiadef index(request): categoria = Categoria.objects.all() return render(request, index.html, { categoria:categoria })def noticias(request): noticias = Noticia.objects.all() return render(request, index.html, { noticias:noticias })def noticias(request, key): noticia = Noticia.objects.get(pk = int(key)) return render(request, index.html, { noticia:noticia })
    41. 41. Plantillas
    42. 42. Plantillas I <div class="row">! ! {% for noticia in noticias %} <div class="span5"> <h2>{{noticia.titulo}}</h2> <p>{{noticia.detalle}}</p> <p> <a href="/noticia/{{noticia.id}}/">Ver detalle</a> </p> </div> ! ! {% endfor %}</div>
    43. 43. Plantillas II{% extends "base.html" %}{% block "content" %}<div class="row">! <div class="span12">! ! <h2>{{noticia.titulo}} - {{noticia.fecha|date:"d/m/Y"}}</h2>! ! <p>{{noticia.detalle}}</p>! ! <p><a class="btn" href="/">Volver &raquo;</a></p>! </div></div>{% endblock%}
    44. 44. Administrador
    45. 45. Administrador
    46. 46. Registrando mis modelosfrom labdjango.myapp.models import Region, Sucursaladmin.site.register(Region)admin.site.register(Sucursal)
    47. 47. Registrando mis modelosINSTALLED_APPS = ( django.contrib.auth, django.contrib.contenttypes, django.contrib.sessions, django.contrib.sites, django.contrib.messages, django.contrib.staticfiles, labdjango.myapp # Uncomment the next line to enable the admin: django.contrib.admin,)
    48. 48. Registrando mis modelosfrom django.conf.urls.defaults import patterns,include, urlfrom django.contrib import adminadmin.autodiscover()urlpatterns = patterns(, # Uncomment the next line to enable the admin: url(r^admin/, include(admin.site.urls)),)
    49. 49. Administrador muy configurableclass NoticiaAdmin(admin.ModelAdmin):! search_fields = [titulo, detalle]! list_filter = (estado,)! list_display = (categoria, titulo,fecha)! date_hierarchy = fecha!
    50. 50. Forms
    51. 51. Forms Ifrom django import formsclass ContactoForm(forms.Form): asunto = forms.CharField(max_length=100) mensaje = forms.CharField() email = forms.EmailField()
    52. 52. Forms IIdef contacto(request): if request.method == POST: form = ContactoForm(request.POST) if form.is_valid(): # Hacemos Algo return redirect(/gracias/) else: form = ContactoForm() return render(request, contacto.html,{ form: form })
    53. 53. Forms III<div class="row">! <form action="/contacto/" method="post">{% csrf_token %}! {{ form.as_p }}! <input type="submit" value="Enviar" />! </form></div>
    54. 54. Vistas Genéricas
    55. 55. direct_to_templatefrom django.views.generic.simple import direct_to_template...(r^gracias/$, direct_to_template, {template: gracias.html, extra_context:context}),
    56. 56. list_detail.object_list(r^ultimas/$, list_detail.object_list, rule_info),rule_info = { queryset: Noticia.objects.order_by(-fecha)[:3], extra_context:context, template_name: ultimas.html,}
    57. 57. FinLuis Cruz@lcruzc
    1. A particular slide catching your eye?

      Clipping is a handy way to collect important slides you want to go back to later.

    ×