Sie sind auf Seite 1von 33

App Engine e Python

Voc programa e o Google escala! Renzo Nuccitelli


This book is for sale at http://leanpub.com/appengine This version was published on 2014-01-31

This is a Leanpub book. Leanpub empowers authors and publishers with the Lean Publishing process. Lean Publishing is the act of publishing an in-progress ebook using lightweight tools and many iterations to get reader feedback, pivot until you have the right book and build traction once you do. 2014 Renzo Nuccitelli

Tweet This Book!


Please help Renzo Nuccitelli by spreading the word about this book on Twitter! The suggested hashtag for this book is #appengineescala. Find out what other people are saying about the book by clicking on this link to search for this hashtag on Twitter: https://twitter.com/search?q=#appengineescala

Dedico esse livro minha me Amanda e minha noiva Priscila, que sempre me apoiam, por mais malucas que sejam minhas idias. Ao meu grande amigo Reginaldo Filho, vulgo Beraba, que me apresentou ao Google App Engine. Aos meus amigos Dnis Costa e Giovane Liberato, que criaram e me permitiram usar o sensacional ttulo desse livro. Ao Luciano Ramalho, meu tutor e parceiro no site Python Pro. A todos alunos, que me motivam a continuar ensinando. A todos os mestres que passaram pela minha vida e me salvaram pela educao.

Contedo
Prefcio . . . . . . . . . . . . . . . . . Relao de Confiana . . . . . . . . Por que Google App Engine (GAE)? Por que Python? . . . . . . . . . . . Pblico . . . . . . . . . . . . . . . . Conhecimento Prvio . . . . . . . . Cdigo Fonte . . . . . . . . . . . . Organizao do Contedo . . . . . Ambiente de Desenvolvimento Introduo . . . . . . . . . . . Interpretador Python . . . . . Terminal de Comando . . . . Pycharm . . . . . . . . . . . . Publicao (Deploy) . . . . . . Windows e Mac . . . . . . . . Resumo . . . . . . . . . . . . Questes . . . . . . . . . . . . Respostas . . . . . . . . . . . Webapp2 . . . . . . . . . . Introduo . . . . . . . . O que Webapp2? . . . . Arquivo app.yaml . . . . Roteamento via Webapp2 Request . . . . . . . . . Response . . . . . . . . . Redirect . . . . . . . . . Resumo . . . . . . . . . Questes . . . . . . . . . Respostas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . i i i ii ii ii iii iii 1 1 1 2 4 5 9 11 12 13 14 14 14 15 18 20 21 21 23 24 25

Prefcio
A educao a arma mais poderosa que voc pode usar para mudar o mundo. - Nelson Mandela

Relao de Confiana
Durante minha vida passei por algumas situaes e precisei de ajuda. E por isso fui salvo pela educao. Se voc no pode pagar, envie um email para renzo.n@gmail.com para poder adquirir o livro de forma legal. Em contrapartida peo o seguinte, na base da confiana: 1. 2. 3. 4. Curta a fan page; Divulgue o livro entre seus amigos; Envie sua opinio aps a leitura, permitindo sua divulgao; Compre uma cpia quando estiver em condies.

Por que Google App Engine (GAE)?


No incio de 2010 topei o desafio de desenvolver um site destinado ao trfego de fotos. Eu j desenvolvia software mas no tinha conhecimento profundo sobre todo o processo. Em particular, no conhecia nada sobre servidores. Ento comecei a procurar um host. Montei meu ambiente de desenvolvimento. Contudo, achava que a estrutura escolhida no suportaria o volume esperado de fotos. Era poca da exploso dos sites de compras coletivas e meus clientes pretendiam fazer promoes. Foi ento que num almoo meu amigo Reginaldo me apresentou a soluo: App Engine. Para me convencer, ele fez um Hello World em 5 minutos, incluindo o deploy. Aliado simplicidade vinha a promessa de que o site escalaria automaticamente. Depois de 3 meses de desenvolvimento em minhas horas livres, estava pronto o Revelao Virtual, precursor do Pic Pro. Aps 2 meses de testes, veio a prova de fogo: foi executada uma promoo no
http://blog.nuccitec.com.br/2013/10/quando-voce-quer-o-universo-conspira-em.html https://www.facebook.com/pythonappengine http://www.picpro.com.br

Prefcio

ii

Groupon. A promessa foi cumprida e o GAE aguentou todos picos de transferncia de arquivos. At hoje o sistema utilizado e j trafegou mais de 2 milhes de fotos. Mas nem tudo foi fcil. Apesar da simplicidade, a plataforma exigiu de mim uma mudana de paradima. E como toda mudana, levou certo tempo para me acostumar. Mas apesar das diferenas, as vantagens se mostraram maiores que os problemas. E isso que mostrarei. Abordarei no s conceitos e exemplos simples, mas apresentarei solues para problemas reais e recorrentes no mundo das aplicaes web.

Por que Python?


Na poca do projeto supracitado eu era fluente apenas em Java. Por conta disso, iniciei o projeto nessa linguagem. Contudo o GAE era muito diferente do que estava acostumado. No permitia o uso de vrios frameworks consagrados, como o Hibernate. Resolvi ento testar a linguagem Python, a primeira suportada pela plataforma. Mais do que resolver o problema de desenvolvimento, me apaixonei pela linguagem e por sua comunidade. Ela me permitiu ser mais expressivo, exigindo a escrita de muito menos cdigo. Portei o Pic Pro para Python em 1 semana. A quantidade de cdigo diminuiu 65%. Desde ento trabalho sempre com Python, tanto para desenvolvimento de aplicaes comerciais como para ensinar. Ela excelente para iniciantes que desejam aprender programao de uma maneira prtica, simples e expressiva.

Pblico
Este livro foi escrito para quem deseja aprender a fazer uma aplicao completa para internet. Mais do que isso, ele ideal para quem quer transformar uma idia em um produto web rapidamente, sem ter que aprender a complexa arte de escalar servidores. A documentao do GAE excelente, objetiva e centralizada. Mas muitas vezes apresenta ferramentas superficialmente. Sendo assim, esse livro uma excelente fonte para voc ir alm do bsico, desenvolvendo solues profissionais e robustas.

Conhecimento Prvio
recomendvel o conhecimento bsico sobre protocolo HTTP, HTML, Javascript e CSS. Se voc no possui algum deles, pesquise cada assunto somente quando necessrio para entender os exemplos.
http://hibernate.org/

Prefcio

iii

Cdigo Fonte
Todo cdigo fonte contido no livro livre e pode ser encontrado em https://github.com/renzon/ livrogae. Recomenda-se utilizar o histrico de commits, que segue cronologia do livro: https://github. com/renzon/livrogae/commits/master.

Organizao do Contedo
O contedo est organizado nos seguintes captulos: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Ambiente de Densenvolvimento: como montar o ambiente local de desenvolvimento; Webapp2: apresentao do framework web Webapp2 ; Tekton: apresentao do framework web Tekton; Testes Automatizados: como testar automaticamente sua aplicao; Frontend: linguagem de template e arquivos estticos; Banco de Dados: persistncia de dados utilizando o Big Table; Camada de Negcio: arquitetura para camada de negcios com GaeBusiness; Usurios: login e controle de acesso de usurios; Upload e Download: upload e download de arquivos; Agendamento e Fila de Tarefas: fila e agendamentos de tarefas para processamento; Servios Remotos: acesso a servios de outros sites.

Todos captulos contm questes e respectivas respostas em seu final para fixao do conhecimento. O material aqui produzido resultado de muito estudo, prtica e dedicao. Divirta-se!

Ambiente de Desenvolvimento
Se quiser derrubar uma rvore em metade do tempo, passe o dobro do tempo amolando o machado. - Provrbio chins de autor desconhecido

Introduo
O ambiente de desenvolvimento o conjunto de ferramentas que o desenvolvedor utiliza para construir software em seu computador. Ambientes complexos, com erros ou que demoram a executar suas tarefas comprometem profundamente a produtividade. Por isso, como no caso do machado da parbola, mantenha-o sempre afiado. Nesse captulo sero instalados os itens necessrios para o desenvolvimento: interpretador Python, Kit de Desenvolvimento de software (SDK, do ingls Software Development Kit ). Alm desses, tambm ser utilizado um Ambiente Integrado de Desenvolvimento (IDE, do ingls Integrated Development Enviroment ), o Pycharm. Em caso de dificuldade, assista s duas primeiras vdeo-aulas na internet.

Interpretador Python
Atualmente existem duas principais verses da linguagem: 2.7 e 3.3. Sempre bom utilizar a ltima, por conta das melhorias. Mas muitos frameworks ainda no foram portados para a nova verso. O App Engine um caso e por isso a plataforma s aceita a verso 2.7 da linguagem Python. No Linux el j est disponvel por padro. Para instalar em outros sistemas, visite a pgina de downloads e escolha a verso adequada ao seu Sistema Operacional. Para verificar aquela que est instalada em seu sistema, abra um terminal de comando e digite python. A verso disponvel impressa como primeira linha aps a execuo, conforme a listagem 1.01 a seguir:

https://www.youtube.com/watch?v=HYU5rO3trPc&list=PLA05yVJtRWYQMVMp9gFvaW2KZSpR_sZsH http://www.python.org/getit/

Ambiente de Desenvolvimento

Listagem 1.01: Execuo do Python

Python 2.7.3 (default, Sep 26 2013, 20:03:06) [GCC 4.6.3] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>>

Caso aparea uma mensagem informando que o comando no existe, deve ser instalado o interpretador atravs do link j mencionado. Se a instalao j foi feita, verifique se o endereo de instalao foi adicionado ao path.

Terminal de Comando
Para ser possvel emular e desenvolver a aplicao em um computador, necessrio instalar o Kit de Desenvolvimento Padro (SDK, do ingls Standard Development Kit ). Ele prov as ferramentas necessrias para inicializao do servidor localmente, interao com banco de dados, entre outras que sero vistas nesse livro. Assim como o interpretador, o endereo de instalao tambm deve ser adicionado ao path. Para fazer isso no Linux, acesse a sua pasta home e utilize o atalho Crtl+h para visualizar os arquivos ocultos. Dentre esses arquivos se encontram dois de interesse: o .bashrc e o .profile. Edite esses arquivos adicionando em seus finais as seguintes linhas:
Listagem 1.02: Adio de varivel de Ambiente no Linux

export GAE_SDK="seu diretorio"/google_appengine PATH=$PATH:$GAE_SDK

Na listagem 1.03 se encontra um exemplo para um SDK que foi instalado em diretrio bin localizado na pasta home:
Listagem 1.03: Arquivo .bashrc editado para colocar SDK no path

# enable programmable completion features (you don't need to enable # this, if it's already enabled in /etc/bash.bashrc and /etc/profile # sources /etc/bash.bashrc). if [ -f /etc/bash_completion ] && ! shopt -oq posix; then . /etc/bash_completion fi export GAE_SDK=/home/renzo/bin/google_appengine PATH=$PATH:$GAE_SDK
https://developers.google.com/appengine/downloads?hl=pt-br

Ambiente de Desenvolvimento

Ol Mundo - Terminal
Dentro da pasta do Kit de Desenvolvimento existe uma diretrio com um modelo de projeto. Acesseo e copie a pasta new_project_template para um endereo de sua preferncia. A figura 1.01 a seguir mostra o contedo do SDK aps extrao de seu contedo:

Figura 1.01: Contedo SDK GAE

Copiada a estrutura do projeto, navegue at seu diretrio no terminal e digite o seguinte comando dev_appserver.py. A figura 1.02 mostra o console no caso de execuo correta do programa. A partir desse momento o SDK est servindo a aplicao localmente. Acesse o endereo http://localhost:8080 em seu navegador e confira se aparece a mensagem Hello World. Em caso negativo, confira os passos anteriores. Desligue o servidor utilizando o atalho Ctrl+C.

Figura 1.02: Comando dev_appserver.py

Ambiente de Desenvolvimento

Pycharm
Apesar de ser possvel utilizar a linha de comando e um editor de texto simples para desenvolver, nesse livro ser utilizado o Ambiente de Desenvolvimento Integrado (IDE, do ingls Integrated Development Enviroment ) Pycharm. Outros tambm podem ser utilizados , como o Pydev, que inclusive gratuito. Mas aquele foi escolhido por sua robustez e conjunto de ferramentas. Para conseguir executar o Pycharm necessrio instalar o Mquina Virtual Java(JVM, do ingls Java Virtual Machine). Aps baixar o pacote adequado ao seu sistema tambm necessrio adicionlo ao path. Acrescente as seguintes linhas aos arquivos .bashrc e .profile, onde a varivel JAVA_HOME deve apontar para o diretrio onde foi extrado o JDK:
Listagem 1.04: Arquivo .bashrc editado para colocar JDK no path

export JAVA_HOME=/home/renzo/bin/jdk1.7.0_45 PATH=$PATH:$JAVA_HOME/bin

Cumpridas essas etapas, navegue at o diretrio bin da pasta de instalao do Pycharm no terminal e rode o script pycharm.sh. Com o ambiente inicilizado voc pode fixar seu cone na barra de tarefas para poder inicializar a aplicao apenas com um clique. A listagem 1.05 contm um exemplo do comando:
Listagem 1.05: Execuo do script pycharm.sh

renzo@renzo-ultrabook:~$ ./bin/pycharm-3.0.1/bin/pycharm.sh

Ol Mundo - IDE
Ao iniciar a IDE, clique em Create New Project e escolha o tipo de projeto Google App Engine project. Voc deve assinalar um identificador para o seu projeto e informar o diretrio onde se encontra o SDK do Google App Engine. A tela de criao de projeto deve ficar semelhante figura 1.03:
http://www.jetbrains.com/pycharm/download/ http://pydev.org/ http://www.oracle.com/technetwork/pt/java/javase/downloads/jdk7-downloads-1880260.html

Ambiente de Desenvolvimento

Figura 1.03: Novo projeto GAE - Pycharm

Para executar o servidor local, basta clicar no cone verde play que se encontra em destaque na figura 1.4. Verique se no link http://localhost:8080 , utilizando seu navegador web, aparece a mensagem Hello World. Em caso negativo, repita os passos anteriores.

Figura 1.04: Inciando servidor local - Pycharm

Publicao (Deploy )
Muitos programadores iniciantes comeam a desenvolver suas aplicaes logo aps aprenderem como inicializar o servidor localmente. Contudo o processo de publicao do site um passo fundamental. Somente dessa maneira os usurios podem acessar o site pela rede.

Ambiente de Desenvolvimento

O deploy deve ser simples em um bom processo de desenvolvimento, de preferncia com apenas um clique ou comando. Mais do que isso, o site deve ser publicado de maneira frequente. Por essa razo, recomenda-se iniciar o desenvolvimento apenas aps a publicao do site pela primeira vez, mesmo que seja apenas para imprimir uma mensagem simples. Afinal de contas, no faz sentido desenvolver um site se no for possvel disponibiliz-lo na rede. Como afirmaram Jez Humble e Dave Farley em seu livro Entrega Contnua: Atualmente muitas companhias esto fazendo mltiplos deploys em apenas um dia. Foge ao escopo desse livro implementar o processo automatizado. Contudo fazer o deploy manualmente, antes do desenvolvimento em si, o primeiro passo nesse sentido.

Painel de Controle
Para publicao, necessrio que voc crie uma aplicao no Painel de Controle do Google App Engine. Para isso, acesse http://appengine.google.com. Ser necessrio utilizar uma Conta Google. Aps o cadastro, voc ir visualizar o painel. Clique em Create Application para gerar uma nova aplicao. Crie um identificador nico e atribua um nome aplicao, como na figura 1.05. Finalize o cadastro clicando novamente em Create Application.
These days, many companies are putting out multiple releases in a day. Continuous Delivery, p. xxiii

Ambiente de Desenvolvimento

Figura 1.05: Formulrio App Engine

Cadastrada a aplicao, edite o arquivo de configurao app.yaml que se encontra na raiz de seu projeto. Copie o identificador na primeira linha, no item application. Um exemplo da primeira linha do arquivo se encontra na listagem 1.06:
Listagem 1.06: Primeira linha do arquivo app.yaml application: cursospythonpro

Para usar o App Engine sua conta precisa ser verificada por celular atravs de um sms. Usurios j se queixaram dessa mensagem nunca chegar para clientes da operadora Oi. Para evitar isso, use um celular de outra operadora ou ento pea que um conhecido j cadastrado o convide, via painel de adminstrao, para ser administrador de um projeto j existente. No caso desses convites, a verificao no necessria.

Deploy - Terminal de Comando


Editado o arquivo app.yaml, navegue at o diretrio do projeto no terminal e utilize o comando update do script appcfg.py do SDK:

Ambiente de Desenvolvimento

Listagem 1.07: Deploy via bash

renzo@renzo-ultrabook:~$ cd PycharmProjects/cursospythonpro/ renzo@renzo-ultrabook:~/PycharmProjects/cursospythonpro$ appcfg.py update .

O programa ir pedir seu e-mail e senha. Voc deve inserir os dados relativos conta que utilizou para criar a aplicao no painel de controle. Com esse comando o SDK ir scannear os arquivos do projeto e envi-los ao servidor. Finalizada a publicao, voc consegue acessar o site atravs do endereo http://<seu idenficador>.appspot.com, conforme imagem 1.06:

Figura 1.06: Site publicado no App Engine

Para quem usa login em dois passos, utilize o comando appcfg.py update . --oauth2. Ser exibida a tela de login em seu navegador onde possvel inserir a senha e o cdigo de segurana.

Deploy via Pycharm


Para fazer o deploy com o Pycharm, acesse o menu Tools > Google App Engine > Deploy Application, conforme figura 1.07:
http://www.google.com/intl/pt-PT/landing/2step/

Ambiente de Desenvolvimento

Figura 1.07: Deploy via Pycharm

Insira suas credenciais. Finalizado o processo, possvel acessar o site no endereo supracitado.
Para quem usa login em dois passos, escolha a opo Use Passwordless login via OAuth2. Ser exibida a tela de login em seu navegador onde possvel inserir a senha e o cdigo de segurana.

Windows e Mac
o SDK oferece uma Interface Visual(GUI, do ingls General User Interface) que pode ser utilizada em opo linha de comando para o Sistema Operacional Windows e para o Mac. Para criar um novo projeto, clique em Tools > Google App Engine > Deploy Application, como na figura 1.08:
http://www.google.com/intl/pt-PT/landing/2step/

Ambiente de Desenvolvimento

10

Figura 1.08: GUI do App Engine

Criado o projeto possvel inicar o servidor local clicando no boto Run e fazer o deploy clicando no boto com esse nome. importante notar que a utilizao da IDE Pycharm faz com que o desenvolvimento ocorra da mesma forma nos diferentes sistemas operacionais. Por isso ele ser utilizado como base para os exemplos.

Ambiente de Desenvolvimento

11

Resumo
Nesse seo foi explicado como instalar as ferramentas necessrias para executar o servidor localmente: Interpretador Python verso 2.7 e SDK do Google App Engine. Alm disso, foi instalado o Pycharm, IDE que facilita o desenvolvimento. Mais do que a instalao, foi ensinado como executar o servidor localmente e como fazer a publicao do projeto via linha de comando, IDE e tambm via GUI do SDK do Google App Engine para Windows e Mac. Esse conhecimento possibilitar o desenvolvimento e testes nos prximos captulos.

Ambiente de Desenvolvimento

12

Questes
1. 2. 3. 4. 5. 6. 7. Quais as duas principais verses atuais do interpretador Python? Qual verso de Python suportada atualmente pelo App Engine? Para que serve o SDK do App Engine? Qual a vantagem de colocar ferramentas instaladas no path do Sistema Operacional? O que e para que serve uma IDE? Como se chama o arquivo de configurao de uma aplicao App Engine? Qual o domnio padro para acessar aplicaes App Engine na internet?

Ambiente de Desenvolvimento

13

Respostas
1. As duas principais verses atuais do interpretador Python so 2.7 e 3.3. 2. A verso de Python suportada atualmente pelo App Engine a 2.7. 3. O SDK do App Engine serve para acessar as ferramentas de desenvolvimento, como servidor local e banco de dados. 4. A vantagem de colocar ferramentas no path do Sistema Operacional pode executar comandos independente do diretrio em que se encontre o Terminal de Comando. 5. IDE um Ambiente Integrado de Desenvolvimento. Ele serve para fornecer ferramentas que facilitam o desenvolvimento e faz com que o processo de desenvolvimento seja independete de sistema operacional. 6. O arquivo de configurao de uma aplicao App Engine se chama app.yaml 7. O domnio padro para acessar aplicaes App Engine na internet appspot.com

Webapp2
Linguagem no simplesmente um dispositivo para relatar experincias, mas um framework que as define. - Benjamin Whorf

Introduo
A palavra framework signifca um esquema, um conjunto de passos, que serve para resolver determinado problema. Apesar do termo ser geral, ele muito utilizado em computao como sinnimo de biblioteca. Ou seja, um conjunto de cdigos que se utilizados facilitam a construo de um sistema. Por conta disso, importantssimo saber quais so as questes que um framework busca resolver. Se algum pedisse para uma pessoa se vestir a carter, a pergunta bvia seria: Qual a ocasio?. Sendo assim, seguir os passos de uma biblioteca sem saber seu objetivo anlogo a ir vestido de fraque em uma partida de futebol. Nesse captulo ser explicado o funcionamento do framework Webapp2 e seu objetivo, que abstrair o protocolo HTTP, oferecendo interfaces para receber requisies dos usarios e enviar respectivas respostas.

O que Webapp2?
Webapp2 uma biblioteca de cdigo aberto utilizada na documentao oficial introdutria ao GAE. Ela implementa o padro WSGI (Web Server Gateway Interface) e pode ser utilizada em outras plataformas que forneam intregrao com esse padro. No ser ela a biblioteca base utilizada para construir a maior parte dos exemplos nesse livro. Contudo, seu entendimento fundamental por duas razes: 1. O framework Tekton ir utiliz-la como base; 2. Algumas vezes necessrio fazer uso do Webapp2. Upload e download de arquivos so exemplos desse caso. A seguir seguem as sees explicando os diferentes componentes dessa ferramenta.
Language is not simply a reporting device for experience but a defining framework for it.

Webapp2

15

Arquivo app.yaml
No projeto criado no captulo anterior existe um arquivo de configurao chamado app.yaml conforme listagem 2.01:
Listagem 2.01: Arquivo app.yaml

application: new-project-template version: 1 runtime: python27 api_version: 1 threadsafe: yes libraries: - name: webapp2 version: "2.5.2" handlers: - url: /favicon\.ico static_files: favicon.ico upload: favicon\.ico - url: .* script: main.app

Esse arquivo contm as principais informaes sobre o projeto. Sempre que se quiser entender sua estrutura geral, deve-se verificar o contedo desse arquivo, que ser detalhado nas prximas sees.

Cabealho Inicial
No cabealho inicial do arquivo se encontram informaes bsicas sobre o projeto, conforme listagem 2.02:
Listagem 2.02: Cabealho
1 2 3 4 5

application: new-project-template version: 1 runtime: python27 api_version: 1 threadsafe: yes

Webapp2

16

Na linha 1, application, consta o identificador da aplicao. Conforme foi visto na seo deploy do captulo anterior, esse cdigo deve ser o mesmo utilizado na criao da aplicao no console do GAE. Atravs dele o SDK identifica o projeto e consegue publicar o site corretamentamente na nuvem. J na linha 2 consta a verso da aplicao. importante notar que o GAE permite a existncia vrias verses simultneas. A figura 2.01 mostra uma aplicao com mltiplas verses:

Figura 2.01: Mltiplas Verses

Nesse exemplo a verso 27 padro e, portanto, ela serve a aplicao quando acessada atravs do endereo http://picprolabs.appspot.com. Para acessar diferentes verses, como a 16 por exemplo, seu nmero deve ser concatenado ao incio do domnio. Uma primeira forma de fazer isso acessar o endereo http://16-dot-picprolabs.appspot.com/. Outro endereo vlido http://16.picprolabs. appspot.com/. Recomenda-se utilizar o primeiro, pois ele evita problemas no caso de acesso seguro via https. Cabe ressaltar que esse funcionalidade muito til para se testar a aplicao antes de torn-la disponvel aos clientes. Ou seja, publica-se o site em uma verso especfica, alterando a verso no arquivo de configurao. Suas funcionalidades so conferidas e homologadas no respectivo endereo dedicado. Em caso de sucesso, a nova verso definida como padro, ficando disponvel a todos usurios. Outra vantagem poder retornar verso anterior em caso de problemas. E tudo isso feito com apenas um clique no painel de administrao.

Webapp2

17

As demais linhas definem a verso da linguagem e api. Alm disso, informam se uma instncia da aplicao pode processar requisies em paralelo.

Bibliotecas Embutidas
O GAE fornece um conjunto de bibliotecas embutidas. Para instalao, deve ser editada a seo libraries do arquivo de configurao, conforme listagem 2.03. Cada item define o nome da biblioteca a ser instalada e, opcionalmente, sua respectiva verso. No exemplo foi instalada a verso 2.5.2 da biblioteca Webapp2.
Listagem 2.03: Instalao do framework Webapp2
1 2 3

libraries: - name: webapp2 version: "2.5.2"

Roteamento via Arquivo de Configurao


Roteamento uma questo a ser resolvida por qualquer framework web. ele quem define qual cdigo ser executado no servidor de acordo com o path acessado no navegador. O incio do roteamento se d na defino da seo handlers no arquivo de configurao, conforme listagem 2.04:
Listagem 2.04: Roteamento
1 2 3 4 5 6 7

handlers: - url: /favicon\.ico static_files: favicon.ico upload: favicon\.ico - url: .* script: main.app

Nas linhas 2 a 4 definido um handler para servir o arquivo esttico favicon.ico no path /favicon.ico. Esse endereo padro utilizado pelo navegador para colocar uma imagem respectiva ao site na aba em que ele est aberto, conforme figura 2.02:

Webapp2

18

Figura 2.02: favicon.ico

Mas o assunto de arquivos estticos ser melhor abordado no captulo 4, Frontend. Nesse o foco a execuo de cdigo Python que ocorre quando um endereo digitado no navegador. Na linha 6, contendo a expresso url, esto sendo mapeados todos os paths atravs da expresso regular .*. Essa expresso se traduz como: qualquer cadeia de carateres. Cabe ressaltar que os handlers so processados na ordem em que aparecem. Por essa razo o primeiro trata a chamada em /favicon, enquanto o segundo ir tratar todos os demais. Uma vez mapeado o path, deve ser informado qual ser o script que dever processar a requisio. Isso feito na linha 7, onde configurado o arquivo main.py. Outros handlers poderiam ser adicionados ao arquivo para processar outros endereos.

Roteamento via Webapp2


Uma vez que o arquivo de configurao aponta para um script, importante entender seu contedo, que se apresenta na listagem 2.05 a seguir:
Listagem 2.05: Script main.py
1 2 3 4 5 6 7 8 9 10 11 12

# -*- coding: utf-8 -*from __future__ unicode_literals import webapp2

class HomeHandler(webapp2.RequestHandler): def get(self): self.response.write('Ol Mundo!')

app = webapp2.WSGIApplication([('/', HomeHandler)], debug=True)

Webapp2

19

Na linha 3 importado o mdulo webapp2 pertecente ao framework de mesmo nome. Como se quer construir um handler para tratar requisies, construida a classe HomeHandler herdando de RequestHandler na linha 6. Nessa classe foi sobrescrito o mtodo referente ao respectivo verbo HTTP. No caso do cdigo, sobrescreveu-se o mtodo get na linha 7, referente ao verbo HTTP GET. Por fim, muito comum em Python termos vrias classes declaradas em um mdulo. Sendo assim, apenas acrescentar o script no arquivo de configurao no suficiente para se saber qual handler deve ser executado. Por essa razo necessrio fazer tambm o roteamento dentro do cdigo, como consta na linha 12. Nela criado o parmetro app construindo-se um objeto do tipo WSGIApplication. O primeiro parmetro da construo uma lista de tuplas, onde o primeiro argumento a expresso regular mapeando os paths. No exemplo, est sendo mapeada a raz do projeto '/'. J o segundo parmetro indica a classe, HomeHandler, que ir ser utilizada para tratar a requisio. Com esse cdigo escrito e depois de executar o servidor, possvel obter a mensagem Ol Mundo no navegador, conforme a figura 1.03:

Figura 2.03: Mensagem Ol Mundo! no navegador

Seguindo a mesma filosofia, o script main.py pode ser editado para responder Ol Wepapp2! quando se acessa o path /outra. As mudanas se encontram na listagem 2.06:
Listagem 2.05: Script main.py
1 2 3 4 5 6 7 8 9 10 11 12 13

class HomeHandler(webapp2.RequestHandler): def get(self): self.response.write('Ol Mundo!')

class OutroHandler(webapp2.RequestHandler): def get(self): self.response.write('Ol Wepapp2!')

app = webapp2.WSGIApplication([('/', HomeHandler)], debug=True) app = webapp2.WSGIApplication([('/', HomeHandler),('/outra', OutroHandler)], debug=True)

Na figura 2.04 exibido o resultado do acesso ao path no navegador:

Webapp2

20

Figura 2.04: Mensagem Ol Webpp2! no navegador

Dessa maneira, os passos para se fazer o roteamento so: 1. Configurar o arquivo app.yaml toda vez que se deseja criar um script Python; 2. Configurar cada Handler dentro de seu respectivo script com o Webapp2.

Request
Quando o usurio acessa um site no navegador, ele est enviando uma requisio HTTP. O Webapp2 processa essa requisio, construindo um objeto do tipo Request. atravs dessa inteface que o cdigo do servidor obtm acesso s informaes e parmetros enviados pelo usurio. Parmetros podem ser enviados atravs do que se chama query string, que parte da url localizada aps o sinal ?. Sendo assim. quando se faz uma chamada HTTP do tipo GET possvel editar os valores enviados modificando a url no navegador. Na figura 2.05 consta um exemplo onde so passados os parmetros nome com valor Renzo e sobrenome com valor Nuccitelli. Cada parmetro divido utilizando-se o sinal &:

Figura 2.05: Url com query string no navegador

importante notar que acessando a url, a mensagem apresentada no mais esttica. Ela construda com base nos parmetros enviados. Para isso se utiliza o mtodo get do objeto Request, fornecendo o nome do parmetro do qual se deseja extrair o valor. Os valores obtidos das requisies sempre so do tipo string. A listagem 2.06 apresenta o cdigo do handler com os mtodos get, nas linhas 3 e 4, em destaque:

Webapp2

21

Listagem 2.06: Handler com extrao de parmetros


1 2 3 4 5

class ParametrosHandler(webapp2.RequestHandler): def get(self): nome = self.request.get('nome') sobrenome = self.request.get('sobrenome') self.response.write('Ol %s %s!' % (nome, sobrenome))

Cabe ressaltar que se o parmetro inspecionado no estiver presente na query string, o mtodo get ir retornar None como valor. Muitas outras informaes podem ser extraidas do objeto, tais como cookies, cabealhos HTTP e domnio. Mas esses outros mtodos sero vistos no decorrer do livro, sendo a obteno de parmetros o foco nesse momento.

Response
Aps o recebimento de uma requisio, o servidor deve enviar uma resposta utilizando protocolo HTTP. Para cumprir esse objetivo utilizado o objeto do tipo Response. Ele prov mtodos para auxiliar no envio de dados. Nos exemplos anteriores seu mtodo write foi utilizado para enviar uma string como resposta s requisies. A listagem 2.07 contm o cdigo com o uso desse mtodo, na linha 5, em destaque:
Listagem 2.07: Mtodo write para escrita de strings
1 2 3 4 5

class ParametrosHandler(webapp2.RequestHandler): def get(self): nome = self.request.get('nome') sobrenome = self.request.get('sobrenome') self.response.write('Ol %s %s!' % (nome, sobrenome))

De forma semelhante ao Request, o objeto Response possui mtodos para se alterar cookies e cabealhos HTTP. Esses mtodos tambm sero vistos nos prximos captulos.

Redirect
Muitas vezes ao se acessar uma url o usurio redirecionado para outra. Isso ocorre com frequncia aps a submisso de um formulrio. Seu objetivo evitar que a requisio para salvamento de dados seja enviada novamente, caso o navegador tenha seu boto de atualizar pressionado. Para executar esse redirecionamento o objeto RequestHandler fornece o mtodo redirect. A ele deve ser fornecido como parmetro a url completa, no caso de um servidor externo. No caso de um endereo interno da aplicao, apenas o path precisa ser utilizado. A listagem 2.08 contm cdigo exemplificando os dois casos:

Webapp2

22

Listagem 2.08: Mtodo redirect


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

class RedirecionaParaOutroHandler(webapp2.RequestHandler): def get(self): self.redirect('/outra')

class GoogleHandler(webapp2.RequestHandler): def get(self): self.redirect(str('http://www.google.com'))

app = webapp2.WSGIApplication([('/', HomeHandler), ('/outra', OutroHandler), ('/redirecionar', RedirecionaParaOutroHandler), ('/google', GoogleHandler), ('/parametros', ParametrosHandler)], debug=True)

Dessa maneira, ao acessar http://localhost:8080/redirecionar, o usurio ser redirecionado para http://localhost:8080/outra. Por outro lado, se acessar http://localhost:8080/google, ser redirecionado para http://www.google.com.
importante ressaltar que em um redirecionamento enviada uma respota HTTP de cdigo 30x. Portanto, existe trafgo de dados durante essa operao. Devem ser evitados mltiplos redirecionamentos consecutivos, pois a maioria dos navegadores no permitem mais do que 5 redirecionamentos encadeados. O objetivo evitar o redirecionamento infinito e consumo excessivo de recursos de rede.

Webapp2

23

Resumo
Nesse captulo foram vistos os detalhes do framework de cdigo aberto Webapp2. Atravs de seus 3 principais objetos, Request, Response e RequestHandler possvel obter dados dos usurios, enviar informaes do servidor e redirecion-los para outros endereos. Mais do que simplesmente utilizar essa biblioteca, foi importante entender que ela serve para abstrair o protocolo HTTP. Sendo assim, precisamos apenas conhecer seus componentes para construir um web site. E apesar de simples e poucos componentes, o que foi visto j suficiente para construirmos toda a navegao de uma aplicao. O Webapp no ser o framework base para a construo dos exemplos desse livro. Mas seu conhecimento fundamental, pois com base nele que ir funcionar o framework Tekton, que ser o assunto do prximo captulo.

Webapp2

24

Questes
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Qual o nome do arquivo de configurao do Google App Engine? Para que serve o item application do arquivo de configurao? Para que serve o item version do arquivo de configurao? Qual endereo deve ser utilizado para acessar uma aplicao com id foo e verso 35? Para que serve a seo libraries do arquivo de configurao? Para que serve a seo handlers do arquivo de configurao? Como so definidos os paths mapeados no arquivo de configurao? Por que necessrio mapear RequestHandlers nos scripts Python? Para que serve a classe RequestHandler? Como se relacionam os mtodos da classe RequestHandler e os do protocolo HTTP? Para que serve o objeto Request? Como se obtm os valores de parmetros enviados via query string em uma chamada HTTP do tipo GET? 13. Para que serve o objeto Response? 14. Qual o mtodo do objeto Response serve para enviar strings? 15. Como possvel enviar uma resposta para redirecionamento?

Webapp2

25

Respostas
1. O nome do arquivo de configurao do Google App Engine app.yaml. 2. O item application serve para identificar a aplicao. Ele deve conter o mesmo id definido no momento da criao da aplicao no painel de controle disponvel em http://appengine. google.com. 3. O item version serve para identificar qual verso da aplicao ser utilizada no momento da publicao do site. 4. O endereo para acessar a aplicao foo em sua verso 35 deve ser http://35.foo.appspot.com.br ou http://35-dot-foo.appspot.com.br. recomendado utilizar a segunda forma para evitar problemas quando o acesso for feito via https. 5. A seo libraries serve para configurar as bibliotecas a serem utilizadas na aplicao. O GAE fornece um conjunto de bibliotecas que podem ser instaladas dessa maneira. 6. A seo handlers serve para mapear os scripts Python que sero executados de acordo com o path das requisies HTTP. 7. Para definio dos paths so utilizadas expresses regulares. 8. necessrio mapaear RequestHandlers nos scripts Python porque comum a definio de mltiplas classes em um arquivo. Sendo assim somento o mapeamento via arquivo de configurao no suficiente para definir qual classe ser utilizada para processar uma requisio. 9. A classe RequestHandler serve para definir o cdigo que ir processar uma requisio HTTP. 10. Os mtodos da classe RequestHandler devem ser sobrescritos para processar as chamadas HTTP de tipo com mesmo nome. Por exemplo, uma chamada HTTP do tipo GET ser processada no mtodo sobrescrito get, Uma chamada do tipo POST em um mtodo post e assim or diante. 11. O objeto Request serve como interface para acesso s informaes sobre uma requisio HTTP. 12. Os valores de parmetros enviados via query string em uma chamada HTTP do tipo GET so obtidos utilizando-se o mtodo get do objeto Request. A ele deve ser fornecido o nome do parmetro do qual se quer extrair o valor. 13. O objeto Response server como interface para construo de uma resposta HTTP. Ela contm os dados a serem enviados como resposta a uma requisio. 14. O mtodo write da classe Response serve para enviar strings. 15. Para enviar uma resposta de redirecionamento deve ser utilizado o mtodo redirect do objeto RequestHandler, fornecendo como parmetro o path desejado, no caso de redirecionamento para a mesmo aplicao, ou a url completa em caso contrrio.

Das könnte Ihnen auch gefallen