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
8. O que é o Google AppEngine? Cloudcomputing com o Google Permite que você execute seus aplicativos da web na infra-estrutura do Google. Platform as a Service Abstrai configuração de software e hardware e oferece uma plataforma de desenvolvimento pronta para o uso! Webapp+ Python 2.5+ Datastore
9. Pilha de Soluções Webapp Framework web do Google para desenvolver a camada de apresentação (MVC). Muito fácil de usar. Python 2.5 A melhor linguagem de programação para você escrever facilmente o código de controle do seu aplicativo web. Datastore O jeito Google de armazenar dados. Tudo são chaves e valores. BD não relacional com foco em escalabilidade.
10. O que é o Google AppEngine? Trabalha na equipe do Google AppEngine!
11. Na prática Como fazer um ‘Hello World’? classMainPage(webapp.RequestHandler): defget(self): self.response.headers['Content-Type'] = 'text/plain' self.response.out.write('Hello World!')
12. Na prática Vamos fazer um website similar ao delicious delicious = Favoritos + Tags
16. Na prática Mostrando o HTML (handler do GET) classMainPage(webapp.RequestHandler): defget(self): self.response.out.write(template.render('index.html', {}))
17. Na prática Mostrando o HTML (handler do GET) <form class="myform" action="/" method="post"> <input type="text" name="url"/> <input type="hidden" name="item[tags][]"/> <input title="Inserir" type="submit"/></form>
18. Na prática Processando formulário (handler do POST) classMainPage(webapp.RequestHandler): def post(self): url = self.request.get('url') tags = self.request.get_all('item[tags][]') control.insertBookmark(url, tags) self.redirect('/')
19. Na prática Modelando a entidade de Tag class Tag(db.Model): name = db.StringProperty() @staticmethod def new(name): return Tag(key_name = name, name = name) deftoValueObject(self): return self.name
20. Na prática Modelando a entidade de Bookmark (Favorito) class Bookmark(db.Model): url = db.StringProperty() tags = db.ListProperty(db.Key) date = db.DateTimeProperty(auto_now_add=True) @staticmethod def new(url, tags): return Bookmark(url = url, tags = tags) deftoValueObject(self): tagsObjs = db.get(self.tags) tags = [tagObj.toValueObject() for tagObj in tagsObjs] return BookmarkValueObject(self.url, tags, self.date)
21. Na prática Código de controle (inserção de tag) definsertTagIfNotExists(name): tag = Tag.new(name) return tag.put()
22. Na prática Código de controle (inserção de favorito) definsertBookmark(url, tagsNames): tagsKeys = [] for name in tagsNames: tagsKeys.append(insertTagIfNotExists(name)) bookmark = Bookmark.new(url, tagsKeys) return bookmark.put()
23. Na prática Filtrando urls com uma certa tag (código de controle) defgetAllBookmarks(): bookmarks = Bookmark.all().order("-date").fetch(1000) bookmarks = [bookmark.toValueObject() for bookmark in bookmarks] return bookmarks defgetBookmarksWithTag(name): tag = Tag.get_by_key_name(name) bookmarks = Bookmark.all().filter("tags", tag).order("-date").fetch(1000) bookmarks = [bookmark.toValueObject() for bookmark in bookmarks] return bookmarks
24. Na prática Filtrando urls com uma certa tag (handler do GET) classMainPage(webapp.RequestHandler): defget(self): filter = self.request.get('filter', None) ifnotfilter: bookmarks = control.getAllBookmarks() else: bookmarks = control.getBookmarksWithTag(filter) values = dict( bookmarks = bookmarks, filter= filter ) self.response.out.write(template.render('index.html', values))
25. Na prática Filtrando urls com uma certa tag (template/HTML) {% for bookmark in bookmarks %} <p> <a href="{{bookmark.url}}“target="_blank"> {{bookmark.url}} </a> ( tags: {% for tag in bookmark.tags %} <a href="/?filter={{tag}}">{{tag}},</a> {% endfor %} ) </p> {% endfor %}
26. Na prática Auto-complete de tags (código de controle) defgetAllTags(): tags = Tag.all().fetch(1000) tags = [tag.toValueObject() for tag in tags] returntags
27. Na prática Auto-complete de tags (handler do GET) tags = control.getAllTags() values = dict( bookmarks = bookmarks, tags= tags, filter= filter )
28. Na prática Auto-complete de tags (template/HTML) <script> $(document).ready(function(){ $("#mytags").tagit({ availableTags: [ {% for tag in tags %} '{{tag}}' {% ifnotforloop.last %}, {% endif %} {% endfor %} ] }); }); </script>
29. Lições aprendidas Estude 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. code.google.com/intl/p/appengine/articles/ www.google.com/events/io/2011/
30. Lições aprendidas NoSQL BDs não relacionais são um pesadelo no início. Mas é tudo questão de costume!
31. Lições aprendidas Top-down 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.