Django: o framework web para perfeccionistas com prazos

3,740 views
3,617 views

Published on

Slides com notas da palestra "Django: o framework web para perfeccionistas com prazos".

Published in: Technology

Django: o framework web para perfeccionistas com prazos

  1. 1. 1 Boa noite pessoal, meu nome é Francisco :) Hoje vivemos num tempo de pressa, de urgências e tudo mais. Temos prazos para tudo, e alguma pessoas estão sempre nos lembrando deles, e nos dando a ideia de que estamos atrasados.
  2. 2. Desenvolvendo 2
  3. 3. Desenvolvendo aplicações web 3
  4. 4. Desenvolvendo aplicações web em tempo 4
  5. 5. Desenvolvendo aplicações web em tempo O RD E. REC 5 Esta pressa atingiu o desenvolvimento de software, e as pessoas estão sempre à busca de como desenvolver aplicações web em tempo recorde, mais rápido que todo mundo, para conquistar os clientes. Vamos a uma análise de falso caso? :)
  6. 6. 6 Um cliente PRECISA de uma aplicação simples de notícias, enquetes e banners, com login para um sistema administrativo administrativo, onde essas notícias, enquetes e banners serão gerenciados.
  7. 7. 35 7 O cliente procurou três empresas e elas disseram que construiriam o sistema em 35 dias.
  8. 8. 30 8 A melhor proposta que o cliente consegue é 30 dias de uma empresa nova no mercado.
  9. 9. 20 9 O problema é que o cliente quer tudo isso em 20 dias, e está disposto a pagar por isso. Dinheiro não é problema para este cliente. Você, que ama dinheiro e é um mestre de usabilidade, topa o projeto.
  10. 10. 10 E você é esperto. Você conhece alguns sites que fornecem snippets de código prontinho pra você usar na sua aplicação, você baixa tudo, copia ...
  11. 11. 11 cola tudo, faz alguns ajustes
  12. 12. 12 Traduz as partes in english, junta tudo e
  13. 13. 10 DEZ dias depois 13
  14. 14. 14 o código está pronto.
  15. 15. O teclado mais rápido do Oeste. 15 Você vai até o seu cliente com a aplicação prontinha. Ele fica realmente impressionado em te ver lá DEZ dias depois. Você terminou! Ele precisava da aplicação em 20 dias, você fez na metade do tempo. A melhor proposta que ele recebeu antes de você era de 30 dias. Você foi três vezes mais rápido do que a melhor proposta. O seu cliente tem plena certeza de que você é o cara mais rápido do mundo. E você provavelmente é. O problema é que não é só a velocidade que importa...
  16. 16. #$ %&*&@#@# #@$% O teclado mais rápido do Oeste. 16 Depois de ver a aplicação “funcionando”, o seu cliente não mudou de ideia, ele continua te achando o mais rápido. O título de teclado rápido do Oeste é seu, você é o mais rápido em escrever código. Mas desenvolver software não é só escrever código, desenvolver software não é só correr para escrever mais código em menos tempo.
  17. 17. 17 Você é o número 1 em velocidade, mas o seu cliente precisava de um produto de qualidade num tempo inferior ao tempo necessário para atingir tal qualidade. Você deveria ter entregado um meio produto, mas você foi rápido o suficiente para entregar um produto meia boca. Você ganhou um título. Você é rápido, você chega na frente, você é o melhor em algo. O problema é que ser o melhor em algo que não é importante nem sempre é bom, e quando é bom,
  18. 18. 18 É bom só pra você. [...]
  19. 19. 19 A satisfação do seu cliente é fundamental.
  20. 20. Django O framework web para perfeccionistas com prazos 20 Hoje nós vamos falar de um framework para perfeccionistas com prazos, desenvolvedores que conhecem e respeitam os prazos, mas respeitam, acima de tudo, a qualidade do produto a ser desenvolvido.
  21. 21. quem é você? 21 Antes de seguir em frente, quero rapidamente conhecer vocês. Alguém aqui conhece conhece e/ou tem experiênca com: - O básico de Python? •- Orientação a Objetos? •- Desenvolvimento web? •- Estrutura de funcionamento da web (protocolo HTTP, request, response)?
  22. 22. Welcome to the Django! 22 Django. O que é Django? Framework pra perceccionistas com prazo? Qqisso?!?!?! E aquele pônei?
  23. 23. 23 Django Pony, mascote não oficial do Django.
  24. 24. 24 Internacionalmente conhecido por suas aparições na televisão.
  25. 25. 25 Também costuma estar presente nas conferências de desenvolvimento de software.
  26. 26. 26 Inclusive apresentando palestras de alto nível.
  27. 27. 27 Mas é importante respeitar o Django Pony, pois ele pode te atacar repentinamente.
  28. 28. 28 E os ataques dele são mortais.
  29. 29. mas qual é a relação? 29 Qual é a relação entre um pônei rosa e um framework web?
  30. 30. Magia 30 Magia :)
  31. 31. 31 Já temos um cliente insatisfeito, eu já conheço vocês, vocês já conhecem um pônei rosa, tá na hora de conhecer esse tal de Django né?! O Django é um framework, uma caixa de ferramentas à sua disposição para construir aplicações web de qualidade em tempo recorde.
  32. 32. 32 O Django foi criado para o portal do Lawrence Journal World, um jornal da cidade de Lawrence, no estado do Kansas, nos Estados Unidos.
  33. 33. 33 Django vem sido adotado em outros projetos de larga escala. Na onda crescente de cloud computing, Django serviu como base para o projeto Nebula, plataforma de cloud computing da Nasa e para o App Engine, plataforma de cloud computing do Google.
  34. 34. Abrindo a caixa 34 Sabemos que Django é como se fosse uma caixa de ferramentas. Vamos olhar dentro da nossa caixa de ferramentas e entendê-la melhor :)
  35. 35. Orientado a aplicações 35 Django é orientado a aplicações, aplicações plugáveis. Você tem blocos de montar que integram-se para a construção dos seus projetos. Você encontra várias aplicações reusáveis na internet.
  36. 36. 36 E você pode montar esses blocos com muita facilidade. Django é fácil, e lhe permite caminhar por um caminho de qualidade com relativa facilidade. Se o seu projeto vai usar n aplicações plugáveis ou você vai desenvolver todas “no braço”, você certamente não encontrará tanta dificuldade e você provavelmente vai se divertir.
  37. 37. 37 Open source: Django é open source, pertence à comunidade, é meu, é seu. Se você acha que Django tem um problema, você pode reportá-lo e até corrigi-lo. Você pode fazer um fork do Django para adequá-lo à sua necessidade, ou qualquer coisa do tipo :)
  38. 38. MVC? 38 Django é baseado em MVC? Eu trabalho nestas três camadas?
  39. 39. MVC? +-39 +/-
  40. 40. 40 Django organiza-se utilizando MTV: Model, template e view.
  41. 41. 41 Essa é a estrutura completa de funcionamento de um request/response no Django, mas não é importante agora entender isso :)
  42. 42. Cliente (browser) Template URL View Model Banco de dados 42 Esta é uma estrutura mais simples. Útil o suficiente para o nosso exemplo. Temos nosso browser, o Firefox, por exemplo. Ele vai acessar uma página de um sistema feito em Django.
  43. 43. GET /livros Template URL View Model Banco de dados 43 A página a ser acessada está na URL /livros. O cliente faz então a requisição em /livros.
  44. 44. (r'^livros/$', 'views.listar_livros'), GET /livros Template Módulo de URLs View Model Banco de dados 44 Neste momento o módulo de URLs do Django entra em ação para detectar qual a view responsável por tratar o acesso à URL /livros. A URL /livros está mapeada para a view listar_livros. Uma linha de código e esta URL está mapeada utilizando expressões regulares.
  45. 45. def listar_livros(request): livros = Livro.objects.all() GET /livros return render_to_response('livros.html', locals()) Template Módulo de URLs listar_livros(request) Model Banco de dados 45 Uma view é uma função, a função listar_livros vai receber nosso request e tratá-lo para retornar um response. Trata-se de um ponto “polêmico” do Django. No Django, uma view faz um trabalho semelhante ao trabalho feito por controllers em outros frameworks. Mas não se espante, não vamos escrever nenhum select na camada de interface ou injetar lógica de negócio lá. O que acontece no Django é que a camada de interface não se chama view, e só. Enxergue apenas como uma questão de nomenclatura :)
  46. 46. def listar_livros(request): livros = Livro.objects.all() GET /livros return render_to_response('livros.html', locals()) class Livro(Model): Template titulo = Módulo de URLs CharField(max_length = 100) listar_livros(request) Model: classe Livro Banco de dados 46 A primeira linha da nossa função view faz uma chamada a uma classe Livro, um model. Um objeto que representa, no nosso sistema, o livro verdadeiramente falando. Esta classe também é responsável por fazer a comunicação com o banco de dados, então aqui estamos buscando todos os livros armazenados no banco de dados. O código da classe é bem explicativo: mostra que um livro é um Model e tem um título.
  47. 47. def listar_livros(request): livros = Livro.objects.all() GET /livros return render_to_response('livros.html', locals()) Template Módulo de URLs listar_livros(request) Model: classe Livro Não importa (: 47 Não importa o banco de dados. O Django é capaz de lidar com inúmeros bancos de dados, e é bem provável que pra você não seja muito importante o que está abaixo da camada de modelo. A menos que você tenha um sistema muito grande. Vamos voltar então à nossa view, que tem duas linhas de código. Já temos a lista de livros “em mãos”, agora podemos entregar ela para o nosso cliente, certo?
  48. 48. def listar_livros(request): livros = Livro.objects.all() GET /livros return render_to_response('livros.html', locals()) livros.html Módulo de URLs listar_livros(request) <ul> {% for livro in livros %} Model: classe Livro <li>{{ livro.titulo }}</li> {% endfor %} </ul> 48 Antes, entregamos ao template engine do Django que processa tudo isso e gera a saída para o nosso cliente.
  49. 49. GET /livros livros.html Módulo de URLs listar_livros(request) Model: classe Livro 49 A saída não é tão bonita, mas você vai poder contar com um designer esperto pra te ajudar com isso :)
  50. 50. Cliente (browser) Template URL View Model Banco de dados 50 E agora você pode entender de onde vem o MTV :)
  51. 51. E mais... 51 E tem mais uma coisa que talvez você não tenha percebido ainda.
  52. 52. E mais... 6 linhas de código Python. 52 Com seis linhas de código Python,
  53. 53. E mais... 6 linhas de código Python. 5 linhas de html/template. 53 cinco linhas de código da template engine do Django
  54. 54. E mais... SQL? 6 linhas de código Python. 5 linhas de html/template. 54 e NENHUMA linha SQL nós construímos uma listagem com todos os registros de uma entidade no banco de dados.
  55. 55. Amazing!!! 55 Como diria o Steve Jobs: it's amazing! =D
  56. 56. Amazing!!! Asombroso!!! Surpreendente!!! i18n 56 Django tem um framework de internacionalização extremamente simples de utilizar, que usa o gettext para traduzir termos. Escrever aplicações em vários idiomas no Django é brincadeira de criança.
  57. 57. Autenticação 57 Django também tem autenticação integrada, com cadastro de usuários e grupos, e gerenciamento de permissões.
  58. 58. @login_required def listar_livros(request): livros = Livro.objects.all() return render_to_response('livros.html', locals()) Autenticação 58 Com mais uma linha de código, um simples decorator, poderíamos exigir que o usuário estivesse logado para ver a lista de livros.
  59. 59. Controle de permissão 59 Junto ao cadastro de usuários, o sistema de autenticação do Django também integra controle de permissão.
  60. 60. Controle de permissão @permission_required('livros.pode_listar') def listar_livros(request): livros = Livro.objects.all() return render_to_response('livros.html', locals()) 60 Trocando o login_required por permission_required, podemos criar uma permissão específica e dizer que apenas usuários ou grupos de usuários específicos teriam acesso àquela view.
  61. 61. Django Forms 61 Um outro recurso do Django bastante comentado é o framework de formulários, chamado Django Forms. Vamos ver um pouco do Django Forms...
  62. 62. class LivroForm(Form): titulo = CharField(max_length = 100) Django Forms 62 Aqui estamos definindo um formulário chamado LivroForm que tem um campo título.
  63. 63. class LivroForm(Form): titulo = CharField(max_length = 100) class Livro(Model): titulo = CharField(max_length = 100) Django Forms 63 Note que definimos o formulário praticamente da mesma forma que definimos o model, estamos repetindo código né?! Isso não é muito bom, e até fere um dos princípios do Django. Será que não teria uma forma de somar o Model e o Form?
  64. 64. class LivroForm(ModelForm): class Meta: model = Livro Django Forms 64 ModelForm :) Criamos o form e dizemos qual é o model “dono” dele.
  65. 65. class LivroForm(ModelForm): class Meta: model = Livro class Livro(Model): titulo = CharField(max_length = 100) autor = CharField(max_length = 255) descricao = CharField(max_length = 1024) Django Forms 65 Assim, independente de quantos campos existirem no model, todos vão ser acessados no form e serão exibidos na tela quando formos mostrar o form. O formulário também vai herdar toda a validação do model, assim, teremos formulários prontinhos para nossas aplicações web só esperando para serem exibidos nos templates e tratados nas views. É mágico e faz você andar muito mais rápido.
  66. 66. class LivroForm(ModelForm): class Meta: model = Livro class Livro(Model): titulo = CharField(max_length = 100) autor = CharField(max_length = 255) descricao = CharField(max_length = 1024) Tem um desses pra Fórmula 1? Django Forms 66 [...]
  67. 67. Tá de class LivroForm(ModelForm): sacanagem?! Meta: class model = Livro class Livro(Model): titulo = CharField(max_length = 100) autor = CharField(max_length = 255) descricao = CharField(max_length = 1024) Tem um desses pra Fórmula 1? Django Forms 67 Não tem na F1, mas tem no Django, de verdade :)
  68. 68. class PessoaForm(Form): nome = CharField(max_length = 100) cpf = CPFField() telefone = BRPhoneField() L10n 68 Além da internacionaliação e do Django Forms, também podemos contar com os recursos de Localization do Django. Lembra que os formulários têm validação automática? Assim, podemos validar o tamanho do campo, se ele foi preenchido ou não, se ele é inteiro, se é uma data. Com os recursos de Localization do Django, podemos ir além, e validar automagicamente se um campo é um CPF, um CNPJ, um CEP ou um telefone no formato brasileiro.
  69. 69. class PessoaForm(Form): nome = CharField(max_length = 100) cpf = CPFField() telefone = BRPhoneField() L10n 69 Totalmente assustador.
  70. 70. 1 /2 70 Bom, esse é um momento em que eu preciso respirar e preciso de interação. Eu preciso de no mínimo duas perguntas para seguir com a palestra, então agora é com vocês. O número grande é o contador de perguntas, preciso que vocês façam ele chegar no dois para prosseguirmos. Vamos à pergunta número 1?
  71. 71. 2 /2 71 Pergunta número 2.
  72. 72. Da pra fazer melhor? 72 Ainda tem mais coisas? Da pra melhorar a situação? o__O'
  73. 73. Django admin 73 Sim :) Não sei quantas pessoas aqui já construíram áreas administrativas em sites para gerir conteúdo e entidades. Por exemplo, um sisteminha de notícia com login para você publicar essas notícias. Definitivamente, é algo trabalhoso e que, por vezes, pode fazer com que o desenvolver perca alguma noite de sono. É claro que com recursos de L10n, i18n e o Django Forms, tudo isso fica MUITO mais fácil, mas o Django ainda tem algo muito melhor para te dar noites tranquilas de sono.
  74. 74. class Livro(Model): titulo = CharField(max_length = 100) 74 Vamos à prática, bem melhor assim. Lembram-se do nosso model Livro? Ele tem um título, certo? Então aí está ele.
  75. 75. class Livro(Model): titulo = CharField(max_length = 100) admin.site.register(Livro) 75 Vamos chamar o tal do admin, dentro do site do admin, vamos pedir para ele registrar o nosso model, a nossa classe Livro. Tudo tranquilo até aqui?
  76. 76. class Livro(Model): titulo = CharField(max_length = 100) admin.site.register(Livro) (r'^admin/', include(admin.site.urls)), 76 Lembra lá atrás quando fizemos um mapeamento de uma URL para acessar a listagem de views? Precisamos fazer algo semelhante com o admin, precisamos dar uma URL a ele, e vamos entregar a ele a URL /admin.
  77. 77. class Livro(Model): titulo = CharField(max_length = 100) admin.site.register(Livro) (r'^admin/', include(admin.site.urls)), Resultado? 77 Então, o que acontece quando acessamos /admin, que foi a URL mapeada?
  78. 78. 78 Tela de login, é uma área administrativa né?! Lembra da chatisse de implementar uma gerência de usuários, sistema de login, tratar sessão, colar tudo e traduzir lá do começo? Esquece, existem formas mais legais e inteligentes de gerenciar isso. Apenas preencha o nome de usuário e a senha, e clique em Acessar.
  79. 79. 79 E cá estamos. Na página inicial de administração. Note que não está em inglês :) i18n é a lei =P Veja na coluna da direita um histórico de ações do usuário (que está vazio, obviamente). O mais importante está em destaque, nosso model Livros está ali, com duas opções: Adicionar e Modificar.
  80. 80. 80 Clicando em Adicionar, temos uma tela para o cadastro do Livro. Os campos exibidos são os atributos do model, que no nosso caso é apenas titulo.
  81. 81. 81 Se clicarmos em Salvar sem preencher o título, olha que lindo: ele valida, em português também!
  82. 82. 82 Então preenchemos o título.
  83. 83. 83 E clicamos em salvar para ver a listagem e a mensagem de que nosso amado livro foi salvo com sucesso no banco de dados =D
  84. 84. 84 E se clicamos sobre o livro, podemos editá-lo ou excluí-lo. E sabe o que é realmente bacana nisso tudo?
  85. 85. 4 4 linhas de código. [...] 85 E defintivamente, eu preciso dizer que o Django Admin
  86. 86. Merece a dancinha 86 merece a dancinha do Gato Matrix.
  87. 87. Tem mais? 87 Então, depois disso tudo, tem mais?
  88. 88. Tem Paginação mais? Views genéricas Feeds Mensagens CSRF Signals Testes automatizados [...] 88 Com certeza. Django conta com uma bilbioteca de paginação nativa; views genéricas para automatizar CRUDs; views para feeds (Atom ou RSS, o que você quiser :D); Um framework de mensagens simples e poderoso; CSRF nativo Signals Suporte nativo a testes, com cliente de testes Etc etc etc
  89. 89. Algumas considerações 89 Antes de finalizar, vamos a algumas considerações.
  90. 90. Eu não sei Python 90 Eu não sei Python, tem problema? A vantagem de conhecer profundamente a linguagem Python é que ao desenvolver aplicações em Django, podemos explorar melhor os melhores recursos da linguagem Python para construir o seu software. Assim, o ideal é aprender Django e Python paralelamente, ou até aprender Python antes, e não apenas o suficiente de Python para usar o Django Admin :)
  91. 91. Onde e como hospedar? 91 “Python é a única linguagem de programação com mais frameworks web do que palavras reservadas”. Esta é uma afirmação relativamente famosa no mundo Python. Python tem um problema de excesso de frameworks, e com isso veio um problema na forma como os frameworks se comunicavam com os servidores web. Para solucionar o problema, foi criado o WSGI, que padroniza a forma como frameworks Python se comunicam com servidores web. Assim, basta que o servidor web tenha uma interface WSGI que você poderá utilizar o Django ou outro framework Python. Alguns servidores que podem ser utilizados: Apache, IIS, Nginx, Passenger, dentre outros.
  92. 92. E agora? 92 E agora, o que fazer? Como prosseguir com o Django? Quais são os links bacanas pra seguir em frente?
  93. 93. www.djangoproject.com 93 Site oficial: www.djangoproject.com =)
  94. 94. www.djangobrasil.org 94 Site da comunidade Django Brasil: www.djangobrasil.org
  95. 95. www.aprendendodjango.com 95 Quer aprender Django fácil fácil? Aprendendo Django no Planeta Terra é um livro gratuito, disponível em formato hipertexto (online) e PDF. Veja o site: www.aprendendodjango.com
  96. 96. www.djangosites.org 96 Sentiu falta de alguns sites em Django? Confira neste link: www.djangosites.org
  97. 97. groups.google.com/group/django-brasil 97 Conheça o grupo de desenvolvedores de Django no Brasil inteiro, lá você vai encontrar feras e o apoio necessário para se tornar um ninja em Django. http://groups.google.com/group/django-brasil
  98. 98. www.djangovideos.com 98 O site Django Videos conta com vários vídeos sobre Django, contando com screencasts, palestras, etc. :) www.djangovideos.com
  99. 99. ? /∞ 99 Agora é com vocês, perguntem à vontade ;)
  100. 100. Django O framework web para perfeccionistas com prazos @franciscosouza francisco@franciscosouza.net 100 dê endi.

×