Django para infográficos
Do que precisávamos <ul><li>Precisávamos de um back-end
Que pudesee gerar arquivos XML ou JSON
Que pudessem ser editados em tempo-real (ou quase isso)
Com uma interface jornalista-friendly
E que pudesse gerar diferentes formatos a partir dos dados que foram colocados lá </li></ul>
Em resumo... <ul><li>Um CRUD bem feito
E um BD que cospe uns JSONS e, se não tiver outro jeito, um XML </li></ul>
CRUD bem-feito
Compatível com jornalistas
Gerando JSON [ { &quot;campeao&quot;: 227, &quot;vice&quot;: 12, &quot;vice_nome&quot;: &quot;Argentina&quot;, &quot;ano&q...
Do que não precisávamos? <ul><li>Gerar os gráficos propriamente ditos </li><ul><li>Componentes Flash ou JavaScript fariam ...
Ainda que a arquitetura permita fazermos isso, se quisermos muito </li></ul><li>Servir páginas inteiras em torno dos compo...
Designers fazem UI melhor do que eu
Por que Django? <ul><li>O admin
O ORM
O módulo simplejson
O mapeamento de URLs
O framework de testes </li></ul>
Upcoming SlideShare
Loading in …5
×

Django para infográficos

1,206 views
1,056 views

Published on

Apresentada no FISL11, mostra as idéias por trás de um back-end genérico para armazenagem e recuperação de dados para a produção de infográficos

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
1,206
On SlideShare
0
From Embeds
0
Number of Embeds
51
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Django para infográficos

  1. 1. Django para infográficos
  2. 2. Do que precisávamos <ul><li>Precisávamos de um back-end
  3. 3. Que pudesee gerar arquivos XML ou JSON
  4. 4. Que pudessem ser editados em tempo-real (ou quase isso)
  5. 5. Com uma interface jornalista-friendly
  6. 6. E que pudesse gerar diferentes formatos a partir dos dados que foram colocados lá </li></ul>
  7. 7. Em resumo... <ul><li>Um CRUD bem feito
  8. 8. E um BD que cospe uns JSONS e, se não tiver outro jeito, um XML </li></ul>
  9. 9. CRUD bem-feito
  10. 10. Compatível com jornalistas
  11. 11. Gerando JSON [ { &quot;campeao&quot;: 227, &quot;vice&quot;: 12, &quot;vice_nome&quot;: &quot;Argentina&quot;, &quot;ano&quot;: 1930, &quot;campeao_nome&quot;: &quot;Uruguai&quot;, &quot;terceiro_nome&quot;: &quot;Estados Unidos&quot;, &quot;quarto_nome&quot;: &quot;Iugoslu00e1via&quot;, &quot;anfitriao&quot;: 227, &quot;anfitriao_nome&quot;: &quot;Uruguai&quot;, &quot;quarto&quot;: 240, &quot;campanhas&quot;: [ { &quot;partidas_disputadas&quot;: 5, &quot;saldo_de_gols&quot;: 8, &quot;disputa_de_penaltis&quot;: 0, &quot;gols_feitos&quot;: 16, &quot;numero_de_pontos_ganhos&quot;: 8, &quot;campanha&quot;: 196, &quot;selecao_nome&quot;: &quot;Argentina&quot;, &quot;cartoes_vermelhos&quot;: 0, &quot;selecao&quot;: 12, &quot;quartas_de_final&quot;: 0, &quot;semifinal&quot;: 1, &quot;cartoes_amarelos&quot;: 0, &quot;gols_sofridos&quot;: 8, &quot;derrotas_nos_penaltis&quot;: 0, &quot;numero_de_empates&quot;: 0, &quot;numero_de_vitorias&quot;: 4, &quot;final&quot;: 1, &quot;vitorias_nos_penaltis&quot;: 0, &quot;numero_de_derrotas&quot;: 1 }, { &quot;partidas_disputadas&quot;: 2, &quot;saldo_de_gols&quot;: -4, &quot;disputa_de_penaltis&quot;: 0, &quot;gols_feitos&quot;: 0, &quot;numero_de_pontos_ganhos&quot;: 0, &quot;campanha&quot;: 205, &quot;selecao_nome&quot;: &quot;Bu00e9lgica&quot;, &quot;cartoes_vermelhos&quot;: 0, &quot;selecao&quot;: 21, &quot;quartas_de_final&quot;: 0, &quot;semifinal&quot;: 0, &quot;cartoes_amarelos&quot;: 0, &quot;gols_sofridos&quot;: 4, &quot;derrotas_nos_penaltis&quot;: 0, &quot;numero_de_empates&quot;: 0, &quot;numero_de_vitorias&quot;: 0, &quot;final&quot;: 0, &quot;vitorias_nos_penaltis&quot;: 0, &quot;numero_de_derrotas&quot;: 2 }, { &quot;partidas_disputadas&quot;: 2, &quot;saldo_de_gols&quot;: -8, &quot;disputa_de_penaltis&quot;: 0, &quot;gols_feitos&quot;: 0, &quot;numero_de_pontos_ganhos&quot;: 0, &quot;campanha&quot;: 206, &quot;selecao_nome&quot;: &quot;Bolu00edvia&quot;, &quot;cartoes_vermelhos&quot;: 0, &quot;selecao&quot;: 29, &quot;quartas_de_final&quot;: 0, &quot;semifinal&quot;: 0, &quot;cartoes_amarelos&quot;: 0, &quot;gols_sofridos&quot;: 8, &quot;derrotas_nos_penaltis&quot;: 0, &quot;numero_de_empates&quot;: 0, &quot;numero_de_vitorias&quot;: 0, &quot;final&quot;: 0, &quot;vitorias_nos_penaltis&quot;: 0, &quot;numero_de_derrotas&quot;: 2 },
  12. 12. Do que não precisávamos? <ul><li>Gerar os gráficos propriamente ditos </li><ul><li>Componentes Flash ou JavaScript fariam essa parte
  13. 13. Ainda que a arquitetura permita fazermos isso, se quisermos muito </li></ul><li>Servir páginas inteiras em torno dos componentes com dados </li></ul>
  14. 14. Designers fazem UI melhor do que eu
  15. 15. Por que Django? <ul><li>O admin
  16. 16. O ORM
  17. 17. O módulo simplejson
  18. 18. O mapeamento de URLs
  19. 19. O framework de testes </li></ul>
  20. 21. O Admin <ul><li>Jeito declarativo de definir interfaces de manutenção
  21. 22. Autenticação/autorização embutidas (já fiz um e já chega)
  22. 23. É o nosso CRUD </li></ul>
  23. 24. O ORM <ul><li>Fácil de montar queries
  24. 25. Deixo que ele otimize tudo
  25. 26. Não escrevo SQL
  26. 27. Eventualmente, posso mudar de banco para um NoSQL se a performance melhorar alguma coisa (o pessoal do django-nonrel tem feito bom progresso)
  27. 28. Se precisar muito, posso escrever SQL tunado à mão </li><ul><li>Mas nunca precisei </li></ul></ul>
  28. 29. O módulo simplejson <ul><li>simplejson.JSONEncoder(indent = 4).encode({'rotulo': 'meu dado', 'valor': 123})
  29. 30. Simples assim
  30. 31. Não é XML (e isso é bom) </li></ul>
  31. 32. O mapeamento de URLs <ul><li>Permite criar a ilusão de arquivos estáticos
  32. 33. O cliente não precisa saber o que está acontecendo
  33. 34. As URLs são bonitas (memorizáveis) </li><ul><li>A linha </li></ul></ul>(r'^(?P<indicador_slug>[w-]*)_datas.json$', views.indicador_datas), <ul><ul><li>Cria URLs como </li></ul></ul>http://servidor/aplicacao/pib_datas.json <ul><li>E ficam amigáveis para caches </li></ul>
  34. 35. Como ficou <ul><li>2 servidores Apache com Django
  35. 36. 1 servidor MySQL
  36. 37. Quantos caches precisarmos (temos 2)
  37. 38. … atrás de um balanceador
  38. 39. Back-end atende até 400 requests por segundo (em cada servidor), mas nunca chega nem perto disso
  39. 40. BD se sente solitário, sem ter o que fazer
  40. 41. Caches atendem quase todos os requests </li></ul>
  41. 42. Tipos de dados <ul><li>Cada tipo de dado pede uma aplicação diferente (no nosso modelo)
  42. 43. Há aplicações compartilhadas </li><ul><li>Isso viola um pouco as recomendações oficiais </li></ul></ul>from backend.common.models import Pais, UF <ul><ul><li>Mas resolve nosso problema de dados partilhados
  43. 44. e compartimenta o acesso aos dados </li></ul></ul>
  44. 45. Como podemos crescer? <ul><li>Mais caches por backend
  45. 46. Mais backends
  46. 47. Replicação no BD
  47. 48. BDs não relacionais (?)
  48. 49. Não estamos nem perto dos limites da infra-estrutura </li></ul>
  49. 50. Alternativas <ul><li>Elastic Search tem sido pesquisado </li><ul><li>Simples de usar
  50. 51. Pode ser persistido
  51. 52. … mas não pode cruzar dados e fazer queries complicadas no servidor </li></ul></ul>
  52. 53. Dúvidas?

×