Desenvolvendo aplicativos web com o google app engine

4,810 views

Published on

Palestra realizada por Flávio Juvenal no X Encontro do Grupo de Usuários de Python de Pernambuco (10/02/2011) na Livraria Cultura com o tema Desenvolvendo Apps Web com o Google AppEngine e Python

Published in: Technology, News & Politics

Desenvolvendo aplicativos web com o google app engine

  1. 1. Desenvolvendo aplicativos Web com o Google AppEngine<br />por Flávio Juvenal<br />
  2. 2. Roteiro<br />Introdução<br />Quem Somos?<br />Arquitetura Cloud<br />Google AppEngine<br />O que é?<br />Pilha de Soluções<br />Na prática<br />Lições aprendidas<br />
  3. 3. Quem Somos?<br />Um website e appsobre pessoas e eventos<br />Informações sociais e Recomendações<br />
  4. 4. Quem Somos?<br />
  5. 5. Quem Somos?<br />
  6. 6. Quem Somos?<br />7 alunos doCentro de Informática - UFPE<br />Semi-finalistas do Prêmio Santander de Empreendedorismo<br />Finalistas Campuseiros Empreendem (categoria mobile)<br />
  7. 7. Arquitetura Cloud<br />
  8. 8. O que é o Google AppEngine?<br />Cloudcomputing com o Google<br />Permite que você execute seus aplicativos da web na infra-estrutura do Google.<br />Platform as a Service<br />Abstrai configuração de software e hardware e oferece uma plataforma de desenvolvimento pronta para o uso!<br />Webapp+ Python 2.5+ Datastore<br />
  9. 9. Pilha de Soluções<br />Webapp<br />Framework web do Google para desenvolver a camada de apresentação (MVC). Muito fácil de usar.<br />Python 2.5<br />A melhor linguagem de programação para você escrever facilmente o código de controle do seu aplicativo web.<br />Datastore<br />O jeito Google de armazenar dados. Tudo são chaves e valores. BD não relacional com foco em escalabilidade.<br />
  10. 10. O que é o Google AppEngine?<br />Trabalha na equipe do Google AppEngine!<br />
  11. 11. Na prática<br />Como fazer um ‘Hello World’?<br />classMainPage(webapp.RequestHandler): <br />defget(self):<br />self.response.headers['Content-Type'] = 'text/plain'<br />self.response.out.write('Hello World!')<br />
  12. 12. Na prática<br />Vamos fazer um website similar ao delicious<br />delicious = Favoritos + Tags<br />
  13. 13. Na prática<br />Vamos fazer um website similar ao delicious<br />
  14. 14. Na prática<br />Vamos fazer um website similar ao delicious<br />
  15. 15. Na prática<br />No ar!<br />http://tagyoururl.appspot.com<br />
  16. 16. Na prática<br />Mostrando o HTML (handler do GET)<br />classMainPage(webapp.RequestHandler): <br />defget(self):<br />self.response.out.write(template.render('index.html', {}))<br />
  17. 17. Na prática<br />Mostrando o HTML (handler do GET)<br /><form class="myform" action="/" method="post"><br /> <input type="text" name="url"/> <input type="hidden" name="item[tags][]"/> <input title="Inserir" type="submit"/></form><br />
  18. 18. Na prática<br />Processando formulário (handler do POST)<br />classMainPage(webapp.RequestHandler): <br />def post(self):<br />url = self.request.get('url')<br />tags = self.request.get_all('item[tags][]')<br />control.insertBookmark(url, tags)<br />self.redirect('/')<br />
  19. 19. Na prática<br />Modelando a entidade de Tag<br />class Tag(db.Model):<br /> name = db.StringProperty()<br /> @staticmethod<br />def new(name):<br /> return Tag(key_name = name, name = name)<br />deftoValueObject(self):<br /> return self.name<br />
  20. 20. Na prática<br />Modelando a entidade de Bookmark (Favorito)<br />class Bookmark(db.Model):<br />url = db.StringProperty()<br /> tags = db.ListProperty(db.Key)<br /> date = db.DateTimeProperty(auto_now_add=True)<br /> @staticmethod<br />def new(url, tags):<br /> return Bookmark(url = url, tags = tags)<br />deftoValueObject(self):<br />tagsObjs = db.get(self.tags)<br /> tags = [tagObj.toValueObject() for tagObj in tagsObjs]<br /> return BookmarkValueObject(self.url, tags, self.date)<br />
  21. 21. Na prática<br />Código de controle (inserção de tag)<br />definsertTagIfNotExists(name):<br /> tag = Tag.new(name)<br /> return tag.put()<br />
  22. 22. Na prática<br />Código de controle (inserção de favorito)<br />definsertBookmark(url, tagsNames):<br />tagsKeys = []<br /> for name in tagsNames:<br />tagsKeys.append(insertTagIfNotExists(name))<br /> bookmark = Bookmark.new(url, tagsKeys)<br /> return bookmark.put()<br />
  23. 23. Na prática<br />Filtrando urls com uma certa tag (código de controle)<br />defgetAllBookmarks():<br /> bookmarks = Bookmark.all().order("-date").fetch(1000)<br /> bookmarks = [bookmark.toValueObject() for bookmark in bookmarks]<br />return bookmarks <br />defgetBookmarksWithTag(name):<br />tag = Tag.get_by_key_name(name)<br /> bookmarks = Bookmark.all().filter("tags", tag).order("-date").fetch(1000)<br /> bookmarks = [bookmark.toValueObject() for bookmark in bookmarks]<br />return bookmarks<br />
  24. 24. Na prática<br />Filtrando urls com uma certa tag (handler do GET)<br />classMainPage(webapp.RequestHandler): <br />defget(self):<br />filter = self.request.get('filter', None)<br />ifnotfilter:<br /> bookmarks = control.getAllBookmarks()<br />else:<br /> bookmarks = control.getBookmarksWithTag(filter)<br />values = dict(<br /> bookmarks = bookmarks,<br />filter= filter<br /> )<br />self.response.out.write(template.render('index.html', values))<br />
  25. 25. Na prática<br />Filtrando urls com uma certa tag (template/HTML)<br />{% for bookmark in bookmarks %}<br /><p><br /> <a href="{{bookmark.url}}“target="_blank"> {{bookmark.url}} </a><br /> ( tags:<br /> {% for tag in bookmark.tags %}<br /> <a href="/?filter={{tag}}">{{tag}},</a><br /> {% endfor %}<br /> )<br /></p><br />{% endfor %}<br />
  26. 26. Na prática<br />Auto-complete de tags (código de controle)<br />defgetAllTags():<br />tags = Tag.all().fetch(1000)<br />tags = [tag.toValueObject() for tag in tags]<br />returntags<br />
  27. 27. Na prática<br />Auto-complete de tags (handler do GET)<br />tags = control.getAllTags()<br />values = dict(<br />bookmarks = bookmarks,<br />tags= tags,<br />filter= filter<br />)<br />
  28. 28. Na prática<br />Auto-complete de tags (template/HTML)<br /><script><br /> $(document).ready(function(){<br /> $("#mytags").tagit({<br />availableTags: [<br />{% for tag in tags %}<br /> '{{tag}}' {% ifnotforloop.last %}, {% endif %}<br /> {% endfor %}<br />]<br /> });<br /> });<br /></script><br />
  29. 29. Lições aprendidas<br />Estude<br />Vai usar uma nova tecnologia? Estude ela a fundo antes de começar a desenvolver pra valer! Leia os artigos e veja todas as palestras do Google I/O relacionadas ao Google AppEngine.<br />code.google.com/intl/p/appengine/articles/<br />www.google.com/events/io/2011/<br />
  30. 30. Lições aprendidas<br />NoSQL<br />BDs não relacionais são um pesadelo no início. Mas é tudo questão de costume!<br />
  31. 31. Lições aprendidas<br />Top-down<br />Comece de cima para baixo. Ao contrário do que se pensa, é lá nos protótipos de tela que você melhor conseguirá definir suas entidades e relacionamentos.<br />
  32. 32. Dúvidas?<br />www.socialcats.com.br<br />@flaviojuvenal<br />

×