Desenvolvendo uma aplicação web em minutos




                                  Rodrigo Nossal
Um pouco sobre Django:




       The web framework for perfectionists with deadlines

       Python

       Mapeado objeto­relacional (No SQL!!)

       MVT (MVC), DRY

       URLs Elegantes

       Interface de administração automática

       Internacionalização

       Sistema de Cache

                                http://www.djangoproject.com
Quem usa o Django?




     Google App Engine
Outros frameworks:



       Python:
            TurboGears (http://www.turbogears.com)
            Pylons (http://pylonshq.com)


       PHP:
              Cake (http://cakephp.org)
              Symphony (http://www.symfony­project.org)


       Ruby:
            Rails (http://rubyonrails.org)
            Merb (http://merbivore.com)
A aplicação
A aplicação - Escopo:




         Uma aplicação de microblog (Twitter like)



              Registro (simples)
              Login
              Fazer posts
              Responder aos posts
              Adicionar (seguir) amigos
Botando a mão na massa
Botando a mão na massa - Ambiente:




   Criando um projeto: 

       $ django-admin startproject microblog


   Criando uma aplicação:

       $ cd microblog
       $ ./manage.py startapp app
Botando a mão na massa - Ambiente:




             Microblog
                 Blog
                      __init__.py
                      models.py
                      views.py

                 __init__.py
                 manage.py
                 settings.py
                 urls.py
Botando a mão na massa - Ambiente:


       Base de dados: settings.py
         DATABASE_ENGINE = 'mysql'
         DATABASE_NAME = 'microblog'
         DATABASE_USER = 'django'
         DATABASE_PASSWORD = '123456'


       Templates:
         TEMPLATES_DIRS = (
            os.path.join(os.path.dirname(__file__),
               '/app/templates')


       Habilitar a aplicação:
         INSTALLED_APPS = (
             …
            'microblog.app',
Models




    SQL pra que mesmo?
Models – Criando nossos modelos:



    microblog/app/models.py




    Habilitando o profile: settings.py
      AUTH_PROFILE_MODULE = 'app.UserProfile'
Models – Brincando com a API:


    Sincronizando banco de dados:
       $ ./manage.py syncdb


    Usando o shell:
       $ ./manage.py shell
       >> from django.contrib.auth.models import User
       >> from microblog.app.models import *
       >> u = User(username = 'pedro',
                       first_name = 'Pedro',
                       last_name = 'da Silva')
       >> u.save()
Models – Brincando com a API:


  Usando o shell (continuação):
     >> u
     >> up = UserProfile(user=u)
     >> up.save()
     >> User.objects.all()
     >> User.objects.get(username = 'pedro')
     >> p = User.objects.get(username = 'pedro').
                                        get_ profile()
     >> p.friends.add(User.objects.get(
                               username = 'paulo'))
     >> p.friends.all()
Models – Interface de administração:




         Habilitando a aplicação de administração
           INSTALLED_APPS = (
           …
           'django.contrib.admin',


        app/admin.py
Urls
URLs:

    Urls elegantes, nada de urls como essa:
     http://www.clicrbs.com.br/blog/jsp/default.jsp?uf=1&
  pg=1&coldir=1&section=Blogs&topo=3994.dwt&uf=1&local=
  1&template=3948.dwt&source=DYNAMIC,blog.BlogDataServer,
  getBlog&blog=222&tipo=1&post=199292


    Nosso esquema de urls:
      /<usuario>/<ação>/      Ex.: /rodrigo/friends/
    Nossas ações:
     friends
     followers
     add
     remove
     status /<número>/
URLs:




          Expressões regulares
          Habilitar a url para a interface de administração
             admin.autodiscover()
             (r'^admin/(.*)', admin.site.root)
Vamos testar!




    $ ./manage.py runserver
URLs - Patterns:




   index:
       urlpatterns += patterns('microblog.app.wiews',
           (r'^$', 'index'),
       )
Views
Wiews:



    Generic wiews:
    Autenticação:
      (r'^login$',     'django.contrib.auth.views.login',
            {'template_name': 'login.html'}),
      (r'^logout$', 'django.contrib.auth.views.logout',
            {'next_page': '/'})


    view index:
       from django.http import HttpResponse

         def index(request):
             return HttpResponse(“Hello world!!”)
Templates
Templates:


               Conteúdo separado do design
               Herança (block, extends)
               Blocos (block)
               Snippets (include)
               Filtros
               Tags (for, if, ifequal, ifnotequal)


             {{ varivavel }}

             {% tags %}
             {{ variavel|filtro }}
Templates - herança:




      base.html
Templates:



               base.html
                login.html
                register.html
                profile.html
                index.html
                friends.html
               followers.html
                posts_list_snippet.html
Views & Templates
Views & Templates:



                  index
                  user_friends
                  user_followers
                  user
                  register
                  add
                  remove
                  status
Views & Templates:



      Implementando as views
      Views
         shortcuts: get_object_or_404, render_to_response


      Contexts settings.py
        TEMPLATE_CONTEXT_PROCESSORS = (
             …
             'django.core.context_processors.auth',
Forms, ModelForms
Forms, ModelForms:




        UserCreationForm:
           form = UserCreationForm(request.POST)


        Validação:
          if form.is_valid():


        ModelForm:
          class PostForm(Model.Form)
Onde aprender mais?




     http://docs.djangoproject.com
     http://groups.google.com.br/group/django­brasil
     http://www.aprendendodjango.com
     http://www.djangobrasil.org

Django: Desenvolvendo uma aplicação web em minutos

  • 1.
    Desenvolvendo uma aplicaçãoweb em minutos Rodrigo Nossal
  • 2.
    Um pouco sobreDjango:  The web framework for perfectionists with deadlines  Python  Mapeado objeto­relacional (No SQL!!)  MVT (MVC), DRY  URLs Elegantes  Interface de administração automática  Internacionalização  Sistema de Cache http://www.djangoproject.com
  • 3.
    Quem usa oDjango? Google App Engine
  • 4.
    Outros frameworks: Python: TurboGears (http://www.turbogears.com) Pylons (http://pylonshq.com) PHP: Cake (http://cakephp.org) Symphony (http://www.symfony­project.org) Ruby: Rails (http://rubyonrails.org) Merb (http://merbivore.com)
  • 5.
  • 6.
    A aplicação -Escopo: Uma aplicação de microblog (Twitter like)   Registro (simples)   Login   Fazer posts   Responder aos posts   Adicionar (seguir) amigos
  • 7.
  • 8.
    Botando a mãona massa - Ambiente: Criando um projeto:  $ django-admin startproject microblog Criando uma aplicação: $ cd microblog $ ./manage.py startapp app
  • 9.
    Botando a mãona massa - Ambiente: Microblog Blog __init__.py models.py views.py __init__.py manage.py settings.py urls.py
  • 10.
    Botando a mãona massa - Ambiente:  Base de dados: settings.py DATABASE_ENGINE = 'mysql' DATABASE_NAME = 'microblog' DATABASE_USER = 'django' DATABASE_PASSWORD = '123456'  Templates: TEMPLATES_DIRS = ( os.path.join(os.path.dirname(__file__), '/app/templates')  Habilitar a aplicação: INSTALLED_APPS = ( … 'microblog.app',
  • 11.
    Models SQL pra que mesmo?
  • 12.
    Models – Criandonossos modelos: microblog/app/models.py Habilitando o profile: settings.py AUTH_PROFILE_MODULE = 'app.UserProfile'
  • 13.
    Models – Brincandocom a API:   Sincronizando banco de dados: $ ./manage.py syncdb   Usando o shell: $ ./manage.py shell >> from django.contrib.auth.models import User >> from microblog.app.models import * >> u = User(username = 'pedro', first_name = 'Pedro', last_name = 'da Silva') >> u.save()
  • 14.
    Models – Brincandocom a API:   Usando o shell (continuação): >> u >> up = UserProfile(user=u) >> up.save() >> User.objects.all() >> User.objects.get(username = 'pedro') >> p = User.objects.get(username = 'pedro'). get_ profile() >> p.friends.add(User.objects.get( username = 'paulo')) >> p.friends.all()
  • 15.
    Models – Interfacede administração:  Habilitando a aplicação de administração INSTALLED_APPS = ( … 'django.contrib.admin', app/admin.py
  • 16.
  • 17.
    URLs:   Urls elegantes, nada de urls como essa: http://www.clicrbs.com.br/blog/jsp/default.jsp?uf=1& pg=1&coldir=1&section=Blogs&topo=3994.dwt&uf=1&local= 1&template=3948.dwt&source=DYNAMIC,blog.BlogDataServer, getBlog&blog=222&tipo=1&post=199292   Nosso esquema de urls: /<usuario>/<ação>/ Ex.: /rodrigo/friends/   Nossas ações: friends followers add remove status /<número>/
  • 18.
    URLs:   Expressões regulares   Habilitar a url para a interface de administração admin.autodiscover() (r'^admin/(.*)', admin.site.root)
  • 19.
    Vamos testar! $ ./manage.py runserver
  • 20.
    URLs - Patterns:  index: urlpatterns += patterns('microblog.app.wiews', (r'^$', 'index'), )
  • 21.
  • 22.
    Wiews:   Generic wiews:   Autenticação: (r'^login$', 'django.contrib.auth.views.login', {'template_name': 'login.html'}), (r'^logout$', 'django.contrib.auth.views.logout', {'next_page': '/'})   view index: from django.http import HttpResponse def index(request): return HttpResponse(“Hello world!!”)
  • 23.
  • 24.
    Templates:   Conteúdo separado do design   Herança (block, extends)   Blocos (block)   Snippets (include)   Filtros   Tags (for, if, ifequal, ifnotequal) {{ varivavel }} {% tags %} {{ variavel|filtro }}
  • 25.
  • 26.
    Templates:   base.html   login.html   register.html   profile.html   index.html   friends.html  followers.html   posts_list_snippet.html
  • 27.
  • 28.
    Views & Templates:  index  user_friends  user_followers  user  register  add  remove  status
  • 29.
    Views & Templates:   Implementando as views   Views shortcuts: get_object_or_404, render_to_response   Contexts settings.py TEMPLATE_CONTEXT_PROCESSORS = ( … 'django.core.context_processors.auth',
  • 30.
  • 31.
    Forms, ModelForms:   UserCreationForm: form = UserCreationForm(request.POST)   Validação: if form.is_valid():   ModelForm: class PostForm(Model.Form)
  • 32.
    Onde aprender mais? http://docs.djangoproject.com http://groups.google.com.br/group/django­brasil http://www.aprendendodjango.com http://www.djangobrasil.org