Post on 20-Jun-2015
description
Desenvolvendo aplicativos Web com o Google App Engine
por Flávio Juvenal
Roteiro• Introdução– Quem Somos?– Arquitetura Cloud
• Google App Engine– O que é?– Pilha de Soluções
• Na prática• Lições aprendidas
Quem Somos?
Um website e appsobre pessoas e eventos
Informações sociais e Recomendações
Quem Somos?
Quem Somos?
Quem Somos?
7 alunos doCentro de Informática - UFPE
Semi-finalistas do Prêmio Santander de Empreendedorismo
Finalistas Campuseiros Empreendem (categoria mobile)
Arquitetura Cloud
O que é o Google App Engine?
Platform as a ServiceAbstrai configuração de software e hardware e oferece uma plataforma de desenvolvimento pronta para o uso!Webapp + Python 2.5+ Datastore
Cloud computing com o GooglePermite que você execute seus aplicativos da web na infra-estrutura do Google.
Pilha de Soluções
Python 2.5A melhor linguagem de programação para você escrever facilmente o código de controle do seu aplicativo web.
WebappFramework web do Google para desenvolver a camada de apresentação (MVC). Muito fácil de usar.
DatastoreO jeito Google de armazenar dados. Tudo são chaves e valores. BD não relacional com foco em escalabilidade.
O que é o Google App Engine?
Trabalha na equipe do Google App Engine!
Na práticaComo fazer um ‘Hello World’?
class MainPage(webapp.RequestHandler): def get(self): self.response.headers['Content-Type'] = 'text/plain' self.response.out.write('Hello World!')
Na práticaVamos fazer um website similar ao delicious
delicious = Favoritos + Tags
Na práticaVamos fazer um website similar ao delicious
Na práticaVamos fazer um website similar ao delicious
Na práticaNo ar!
http://tagyoururl.appspot.com
Na práticaMostrando o HTML (handler do GET)
class MainPage(webapp.RequestHandler): def get(self): self.response.out.write(template.render('index.html', {}))
Na práticaMostrando 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>
Na práticaProcessando formulário (handler do POST)
class MainPage(webapp.RequestHandler): def post(self): url = self.request.get('url') tags = self.request.get_all('item[tags][]') control.insertBookmark(url, tags) self.redirect('/')
Na práticaModelando a entidade de Tag
class Tag(db.Model): name = db.StringProperty() @staticmethod def new(name): return Tag(key_name = name, name = name)
def toValueObject(self): return self.name
Na práticaModelando 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) def toValueObject(self): tagsObjs = db.get(self.tags) tags = [tagObj.toValueObject() for tagObj in tagsObjs] return BookmarkValueObject(self.url, tags, self.date)
Na práticaCódigo de controle (inserção de tag)
def insertTagIfNotExists(name): tag = Tag.new(name) return tag.put()
Na práticaCódigo de controle (inserção de favorito)
def insertBookmark(url, tagsNames): tagsKeys = [] for name in tagsNames: tagsKeys.append(insertTagIfNotExists(name)) bookmark = Bookmark.new(url, tagsKeys) return bookmark.put()
Na práticaFiltrando urls com uma certa tag (código de controle)
def getAllBookmarks(): bookmarks = Bookmark.all().order("-date").fetch(1000) bookmarks = [bookmark.toValueObject() for bookmark in bookmarks] return bookmarks
def getBookmarksWithTag(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
Na práticaFiltrando urls com uma certa tag (handler do GET)
class MainPage(webapp.RequestHandler): def get(self): filter = self.request.get('filter', None) if not filter: bookmarks = control.getAllBookmarks() else: bookmarks = control.getBookmarksWithTag(filter) values = dict( bookmarks = bookmarks, filter = filter ) self.response.out.write(template.render('index.html', values))
Na práticaFiltrando 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 %}
Na práticaAuto-complete de tags (código de controle)
def getAllTags(): tags = Tag.all().fetch(1000) tags = [tag.toValueObject() for tag in tags] return tags
Na práticaAuto-complete de tags (handler do GET)
tags = control.getAllTags()values = dict( bookmarks = bookmarks, tags = tags, filter = filter )
Na práticaAuto-complete de tags (template/HTML)
<script> $(document).ready(function(){ $("#mytags").tagit({ availableTags: [
{% for tag in tags %} '{{tag}}'
{% if not forloop.last %}, {% endif %} {% endfor %} ]
}); });</script>
Lições aprendidasEstudeVai 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 App Engine.
code.google.com/intl/p/appengine/articles/
www.google.com/events/io/2011/
Lições aprendidasNoSQLBDs não relacionais são um pesadelo no início. Mas é tudo questão de costume!
Post
Título Texto Data
Post
Título Data
Corpo do Post
Texto
Lições aprendidasTop-downComece 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.
Dúvidas?
www.socialcats.com.br
@flaviojuvenal