SlideShare uma empresa Scribd logo
Desenvolvendo aplicativos Web com o Google AppEngine por Flávio Juvenal
Roteiro Introdução Quem Somos? Arquitetura Cloud Google AppEngine 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 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
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.
O que é o Google AppEngine? Trabalha na equipe do Google AppEngine!
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!')
Na prática Vamos fazer um website similar ao delicious delicious = Favoritos + Tags
Na prática Vamos fazer um website similar ao delicious
Na prática Vamos fazer um website similar ao delicious
Na prática No ar! http://tagyoururl.appspot.com
Na prática Mostrando o HTML (handler do GET) classMainPage(webapp.RequestHandler):    defget(self): self.response.out.write(template.render('index.html', {}))
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>
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('/')
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
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)
Na prática Código de controle (inserção de tag) definsertTagIfNotExists(name):     tag = Tag.new(name)     return tag.put()
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()
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
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))
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 %}
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
Na prática Auto-complete de tags (handler do GET) tags = control.getAllTags() values = dict( bookmarks = bookmarks, tags= tags, filter= filter )
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>
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/
Lições aprendidas NoSQL BDs não relacionais são um pesadelo no início. Mas é tudo questão de costume!
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.
Dúvidas? www.socialcats.com.br @flaviojuvenal

Mais conteúdo relacionado

Mais procurados

Python 07
Python 07Python 07
Python 07
Bruno Catão
 
Técnicas de Refactoring
Técnicas de RefactoringTécnicas de Refactoring
Técnicas de Refactoring
Rodrigo Branas
 
Cucumber Best Practices
Cucumber Best PracticesCucumber Best Practices
Cucumber Best Practices
Karoline Leite
 
Java script aula 05 - funções
Java script   aula 05 - funçõesJava script   aula 05 - funções
Java script aula 05 - funções
Cristiano Pires Martins
 
11 Java Script - Exemplos com eventos
11 Java Script - Exemplos com eventos11 Java Script - Exemplos com eventos
11 Java Script - Exemplos com eventos
Centro Paula Souza
 
Prototype Framework Javascript
Prototype Framework JavascriptPrototype Framework Javascript
Prototype Framework Javascript
Marcio Romu
 
Java script aula 02 - operadores
Java script   aula 02 - operadoresJava script   aula 02 - operadores
Java script aula 02 - operadores
Cristiano Pires Martins
 
Introdução à MEAN Stack
Introdução à MEAN StackIntrodução à MEAN Stack
Introdução à MEAN Stack
Bruno Catão
 
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Carlos Duarte do Nascimento
 
Java script aula 07 - eventos
Java script   aula 07 - eventosJava script   aula 07 - eventos
Java script aula 07 - eventos
Cristiano Pires Martins
 

Mais procurados (10)

Python 07
Python 07Python 07
Python 07
 
Técnicas de Refactoring
Técnicas de RefactoringTécnicas de Refactoring
Técnicas de Refactoring
 
Cucumber Best Practices
Cucumber Best PracticesCucumber Best Practices
Cucumber Best Practices
 
Java script aula 05 - funções
Java script   aula 05 - funçõesJava script   aula 05 - funções
Java script aula 05 - funções
 
11 Java Script - Exemplos com eventos
11 Java Script - Exemplos com eventos11 Java Script - Exemplos com eventos
11 Java Script - Exemplos com eventos
 
Prototype Framework Javascript
Prototype Framework JavascriptPrototype Framework Javascript
Prototype Framework Javascript
 
Java script aula 02 - operadores
Java script   aula 02 - operadoresJava script   aula 02 - operadores
Java script aula 02 - operadores
 
Introdução à MEAN Stack
Introdução à MEAN StackIntrodução à MEAN Stack
Introdução à MEAN Stack
 
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
 
Java script aula 07 - eventos
Java script   aula 07 - eventosJava script   aula 07 - eventos
Java script aula 07 - eventos
 

Destaque

Qml + Python
Qml + PythonQml + Python
Qml + Python
pugpe
 
Python na formacao_de_jovens
Python na formacao_de_jovensPython na formacao_de_jovens
Python na formacao_de_jovens
Marcos Egito
 
Coding Dojo e Test Driven Development
Coding Dojo e Test Driven DevelopmentCoding Dojo e Test Driven Development
Coding Dojo e Test Driven Development
pugpe
 
Rain Toolbox - Previsão de Chuvas
Rain Toolbox -  Previsão de ChuvasRain Toolbox -  Previsão de Chuvas
Rain Toolbox - Previsão de Chuvas
pugpe
 
Criando comunidades bem sucedidas
Criando comunidades bem sucedidasCriando comunidades bem sucedidas
Criando comunidades bem sucedidas
pugpe
 
Pep 8
Pep 8Pep 8
Python Debugger - PUG-PE
Python Debugger - PUG-PE Python Debugger - PUG-PE
Python Debugger - PUG-PE
Arthur Alvim
 
REST APIs com Django
REST APIs com DjangoREST APIs com Django
REST APIs com Django
Mailson Menezes
 
Porque foi bom aprender com Python
Porque foi bom aprender com PythonPorque foi bom aprender com Python
Porque foi bom aprender com Python
Fernando Rocha
 
Pug
PugPug
Python e Cadeias de Markov GHMM
Python e Cadeias de Markov GHMMPython e Cadeias de Markov GHMM
Python e Cadeias de Markov GHMM
pugpe
 
NoSQL com Cassandra e Python
NoSQL com Cassandra e PythonNoSQL com Cassandra e Python
NoSQL com Cassandra e Python
pugpe
 
Computação Científica com Python
Computação Científica com PythonComputação Científica com Python
Computação Científica com Python
Hugo Serrano
 
Palestra sobre Inteligência Coletiva
Palestra sobre Inteligência ColetivaPalestra sobre Inteligência Coletiva
Palestra sobre Inteligência Coletiva
pugpe
 
Pyjamas: Uma Ferramenta Pythônica para Web
Pyjamas: Uma Ferramenta Pythônica para WebPyjamas: Uma Ferramenta Pythônica para Web
Pyjamas: Uma Ferramenta Pythônica para Web
Nielson Santana
 
Arduino e python
Arduino e pythonArduino e python
Arduino e python
Victor Casé
 
Palestra sobre Collections com Python
Palestra sobre Collections com PythonPalestra sobre Collections com Python
Palestra sobre Collections com Python
pugpe
 
Migrando do App Engine para o Heroku
Migrando do App Engine para o HerokuMigrando do App Engine para o Heroku
Migrando do App Engine para o Heroku
Filipe Ximenes
 
Apresentando o I Toró de Palestras do PUG-PE
Apresentando o I Toró de Palestras do PUG-PEApresentando o I Toró de Palestras do PUG-PE
Apresentando o I Toró de Palestras do PUG-PE
Marcel Caraciolo
 
Blender Com Python
Blender Com PythonBlender Com Python
Blender Com Python
pugpe
 

Destaque (20)

Qml + Python
Qml + PythonQml + Python
Qml + Python
 
Python na formacao_de_jovens
Python na formacao_de_jovensPython na formacao_de_jovens
Python na formacao_de_jovens
 
Coding Dojo e Test Driven Development
Coding Dojo e Test Driven DevelopmentCoding Dojo e Test Driven Development
Coding Dojo e Test Driven Development
 
Rain Toolbox - Previsão de Chuvas
Rain Toolbox -  Previsão de ChuvasRain Toolbox -  Previsão de Chuvas
Rain Toolbox - Previsão de Chuvas
 
Criando comunidades bem sucedidas
Criando comunidades bem sucedidasCriando comunidades bem sucedidas
Criando comunidades bem sucedidas
 
Pep 8
Pep 8Pep 8
Pep 8
 
Python Debugger - PUG-PE
Python Debugger - PUG-PE Python Debugger - PUG-PE
Python Debugger - PUG-PE
 
REST APIs com Django
REST APIs com DjangoREST APIs com Django
REST APIs com Django
 
Porque foi bom aprender com Python
Porque foi bom aprender com PythonPorque foi bom aprender com Python
Porque foi bom aprender com Python
 
Pug
PugPug
Pug
 
Python e Cadeias de Markov GHMM
Python e Cadeias de Markov GHMMPython e Cadeias de Markov GHMM
Python e Cadeias de Markov GHMM
 
NoSQL com Cassandra e Python
NoSQL com Cassandra e PythonNoSQL com Cassandra e Python
NoSQL com Cassandra e Python
 
Computação Científica com Python
Computação Científica com PythonComputação Científica com Python
Computação Científica com Python
 
Palestra sobre Inteligência Coletiva
Palestra sobre Inteligência ColetivaPalestra sobre Inteligência Coletiva
Palestra sobre Inteligência Coletiva
 
Pyjamas: Uma Ferramenta Pythônica para Web
Pyjamas: Uma Ferramenta Pythônica para WebPyjamas: Uma Ferramenta Pythônica para Web
Pyjamas: Uma Ferramenta Pythônica para Web
 
Arduino e python
Arduino e pythonArduino e python
Arduino e python
 
Palestra sobre Collections com Python
Palestra sobre Collections com PythonPalestra sobre Collections com Python
Palestra sobre Collections com Python
 
Migrando do App Engine para o Heroku
Migrando do App Engine para o HerokuMigrando do App Engine para o Heroku
Migrando do App Engine para o Heroku
 
Apresentando o I Toró de Palestras do PUG-PE
Apresentando o I Toró de Palestras do PUG-PEApresentando o I Toró de Palestras do PUG-PE
Apresentando o I Toró de Palestras do PUG-PE
 
Blender Com Python
Blender Com PythonBlender Com Python
Blender Com Python
 

Semelhante a Desenvolvendo aplicativos web com o google app engine

Desenvolvendo aplicações web com o framework cakephp
Desenvolvendo aplicações web com o framework cakephpDesenvolvendo aplicações web com o framework cakephp
Desenvolvendo aplicações web com o framework cakephp
Rodrigo Aramburu
 
Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um Framework
Pablo Dall'Oglio
 
Desenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineDesenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App Engine
Campus Party Brasil
 
Aplicacoes Rapidas Para Web Com Django
Aplicacoes Rapidas Para Web Com DjangoAplicacoes Rapidas Para Web Com Django
Aplicacoes Rapidas Para Web Com Django
Diemesleno Souza Carvalho
 
Python e Django
Python e DjangoPython e Django
Python e Django
pugpe
 
Django: Desenvolvendo uma aplicação web em minutos
Django: Desenvolvendo uma aplicação web em minutosDjango: Desenvolvendo uma aplicação web em minutos
Django: Desenvolvendo uma aplicação web em minutos
Rodrigo Nossal
 
LPII_Aula_7-JQuery.pdf
LPII_Aula_7-JQuery.pdfLPII_Aula_7-JQuery.pdf
LPII_Aula_7-JQuery.pdf
GabrielaMota46
 
Wicket 2008
Wicket 2008Wicket 2008
Wicket 2008
Claudio Miranda
 
Aplicações rápidas para a Web com Django
Aplicações rápidas para a Web com DjangoAplicações rápidas para a Web com Django
Aplicações rápidas para a Web com Django
Freedom DayMS
 
ASP.NET MVC Mini Curso
ASP.NET MVC Mini CursoASP.NET MVC Mini Curso
ASP.NET MVC Mini Curso
Vinicius Rocha
 
Mini curso de django
Mini curso de djangoMini curso de django
Mini curso de django
rosenclever
 
Novidades do Django 1.2 e o que vem por ai
Novidades do Django 1.2 e o que vem por aiNovidades do Django 1.2 e o que vem por ai
Novidades do Django 1.2 e o que vem por ai
Marcos Petry
 
Groovy grails
Groovy grailsGroovy grails
Groovy grails
Lucas Aquiles
 
Django - Criando Aplicacoes Plugaveis
Django - Criando Aplicacoes PlugaveisDjango - Criando Aplicacoes Plugaveis
Django - Criando Aplicacoes Plugaveis
Marinho Brandão
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine Orm
Guilherme Blanco
 
Desenvolvimento para a Web com CakePHP
Desenvolvimento para a Web com CakePHPDesenvolvimento para a Web com CakePHP
Desenvolvimento para a Web com CakePHP
Marcelo Andrade
 
Google apps script - Parte 2
Google apps script - Parte 2Google apps script - Parte 2
Google apps script - Parte 2
Sérgio Souza Costa
 
Introdução ao framework CakePHP
Introdução ao framework CakePHPIntrodução ao framework CakePHP
Introdução ao framework CakePHP
igorpimentel
 
Desenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana frameworkDesenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana framework
Marcelo Rodrigo
 
Google apps script - Parte - 1
Google apps script - Parte - 1Google apps script - Parte - 1
Google apps script - Parte - 1
Sérgio Souza Costa
 

Semelhante a Desenvolvendo aplicativos web com o google app engine (20)

Desenvolvendo aplicações web com o framework cakephp
Desenvolvendo aplicações web com o framework cakephpDesenvolvendo aplicações web com o framework cakephp
Desenvolvendo aplicações web com o framework cakephp
 
Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um Framework
 
Desenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineDesenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App Engine
 
Aplicacoes Rapidas Para Web Com Django
Aplicacoes Rapidas Para Web Com DjangoAplicacoes Rapidas Para Web Com Django
Aplicacoes Rapidas Para Web Com Django
 
Python e Django
Python e DjangoPython e Django
Python e Django
 
Django: Desenvolvendo uma aplicação web em minutos
Django: Desenvolvendo uma aplicação web em minutosDjango: Desenvolvendo uma aplicação web em minutos
Django: Desenvolvendo uma aplicação web em minutos
 
LPII_Aula_7-JQuery.pdf
LPII_Aula_7-JQuery.pdfLPII_Aula_7-JQuery.pdf
LPII_Aula_7-JQuery.pdf
 
Wicket 2008
Wicket 2008Wicket 2008
Wicket 2008
 
Aplicações rápidas para a Web com Django
Aplicações rápidas para a Web com DjangoAplicações rápidas para a Web com Django
Aplicações rápidas para a Web com Django
 
ASP.NET MVC Mini Curso
ASP.NET MVC Mini CursoASP.NET MVC Mini Curso
ASP.NET MVC Mini Curso
 
Mini curso de django
Mini curso de djangoMini curso de django
Mini curso de django
 
Novidades do Django 1.2 e o que vem por ai
Novidades do Django 1.2 e o que vem por aiNovidades do Django 1.2 e o que vem por ai
Novidades do Django 1.2 e o que vem por ai
 
Groovy grails
Groovy grailsGroovy grails
Groovy grails
 
Django - Criando Aplicacoes Plugaveis
Django - Criando Aplicacoes PlugaveisDjango - Criando Aplicacoes Plugaveis
Django - Criando Aplicacoes Plugaveis
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine Orm
 
Desenvolvimento para a Web com CakePHP
Desenvolvimento para a Web com CakePHPDesenvolvimento para a Web com CakePHP
Desenvolvimento para a Web com CakePHP
 
Google apps script - Parte 2
Google apps script - Parte 2Google apps script - Parte 2
Google apps script - Parte 2
 
Introdução ao framework CakePHP
Introdução ao framework CakePHPIntrodução ao framework CakePHP
Introdução ao framework CakePHP
 
Desenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana frameworkDesenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana framework
 
Google apps script - Parte - 1
Google apps script - Parte - 1Google apps script - Parte - 1
Google apps script - Parte - 1
 

Mais de pugpe

Projeto Amadeus
Projeto AmadeusProjeto Amadeus
Projeto Amadeus
pugpe
 
E o que danado é o PUG-PE?
E o que danado é o PUG-PE?E o que danado é o PUG-PE?
E o que danado é o PUG-PE?
pugpe
 
Intro
IntroIntro
Intro
pugpe
 
Construindo uma startup em 54 horas com Python
Construindo uma startup em 54 horas com PythonConstruindo uma startup em 54 horas com Python
Construindo uma startup em 54 horas com Python
pugpe
 
Automatizando tarefas com Python
Automatizando tarefas com PythonAutomatizando tarefas com Python
Automatizando tarefas com Python
pugpe
 
Visualização da Informação
Visualização da InformaçãoVisualização da Informação
Visualização da Informação
pugpe
 
Wikilytics
WikilyticsWikilytics
Wikilytics
pugpe
 
Pip - Instalando Pacotes facilmente para Python
Pip - Instalando Pacotes facilmente para PythonPip - Instalando Pacotes facilmente para Python
Pip - Instalando Pacotes facilmente para Python
pugpe
 
Pug pe vii - luciano rodrigues - debugger
Pug pe vii - luciano rodrigues - debuggerPug pe vii - luciano rodrigues - debugger
Pug pe vii - luciano rodrigues - debugger
pugpe
 
Pug pe viii - luciano rodrigues - debugger
Pug pe viii - luciano rodrigues - debuggerPug pe viii - luciano rodrigues - debugger
Pug pe viii - luciano rodrigues - debugger
pugpe
 
Python e Dispositivos Móveis
Python e Dispositivos MóveisPython e Dispositivos Móveis
Python e Dispositivos Móveis
pugpe
 
Redes Neurais e Python
Redes Neurais e PythonRedes Neurais e Python
Redes Neurais e Python
pugpe
 
CATS: Sistema de Recomendação de Eventos
CATS: Sistema de Recomendação de EventosCATS: Sistema de Recomendação de Eventos
CATS: Sistema de Recomendação de Eventos
pugpe
 
Python Funcional
Python FuncionalPython Funcional
Python Funcional
pugpe
 
Open Allure
Open AllureOpen Allure
Open Allure
pugpe
 
Iron Python
Iron PythonIron Python
Iron Python
pugpe
 

Mais de pugpe (16)

Projeto Amadeus
Projeto AmadeusProjeto Amadeus
Projeto Amadeus
 
E o que danado é o PUG-PE?
E o que danado é o PUG-PE?E o que danado é o PUG-PE?
E o que danado é o PUG-PE?
 
Intro
IntroIntro
Intro
 
Construindo uma startup em 54 horas com Python
Construindo uma startup em 54 horas com PythonConstruindo uma startup em 54 horas com Python
Construindo uma startup em 54 horas com Python
 
Automatizando tarefas com Python
Automatizando tarefas com PythonAutomatizando tarefas com Python
Automatizando tarefas com Python
 
Visualização da Informação
Visualização da InformaçãoVisualização da Informação
Visualização da Informação
 
Wikilytics
WikilyticsWikilytics
Wikilytics
 
Pip - Instalando Pacotes facilmente para Python
Pip - Instalando Pacotes facilmente para PythonPip - Instalando Pacotes facilmente para Python
Pip - Instalando Pacotes facilmente para Python
 
Pug pe vii - luciano rodrigues - debugger
Pug pe vii - luciano rodrigues - debuggerPug pe vii - luciano rodrigues - debugger
Pug pe vii - luciano rodrigues - debugger
 
Pug pe viii - luciano rodrigues - debugger
Pug pe viii - luciano rodrigues - debuggerPug pe viii - luciano rodrigues - debugger
Pug pe viii - luciano rodrigues - debugger
 
Python e Dispositivos Móveis
Python e Dispositivos MóveisPython e Dispositivos Móveis
Python e Dispositivos Móveis
 
Redes Neurais e Python
Redes Neurais e PythonRedes Neurais e Python
Redes Neurais e Python
 
CATS: Sistema de Recomendação de Eventos
CATS: Sistema de Recomendação de EventosCATS: Sistema de Recomendação de Eventos
CATS: Sistema de Recomendação de Eventos
 
Python Funcional
Python FuncionalPython Funcional
Python Funcional
 
Open Allure
Open AllureOpen Allure
Open Allure
 
Iron Python
Iron PythonIron Python
Iron Python
 

Desenvolvendo aplicativos web com o google app engine

  • 1. Desenvolvendo aplicativos Web com o Google AppEngine por Flávio Juvenal
  • 2. Roteiro Introdução Quem Somos? Arquitetura Cloud Google AppEngine O que é? Pilha de Soluções Na prática Lições aprendidas
  • 3. Quem Somos? Um website e appsobre pessoas e eventos Informações sociais e Recomendações
  • 6. Quem Somos? 7 alunos doCentro de Informática - UFPE Semi-finalistas do Prêmio Santander de Empreendedorismo Finalistas Campuseiros Empreendem (categoria mobile)
  • 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
  • 13. Na prática Vamos fazer um website similar ao delicious
  • 14. Na prática Vamos fazer um website similar ao delicious
  • 15. Na prática No ar! http://tagyoururl.appspot.com
  • 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.