Appengine Sample

33

Transcript of Appengine Sample

  • App Engine e PythonVoc programa e o Google escala!

    Renzo NuccitelliThis 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 Publishingprocess. Lean Publishing is the act of publishing an in-progress ebook using lightweight tools andmany iterations to get reader feedback, pivot until you have the right book and build traction onceyou 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 thishashtag on Twitter:https://twitter.com/search?q=#appengineescala

  • Dedico esse livro minha me Amanda e minha noiva Priscila, que sempre me apoiam, por maismalucas 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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iRelao de Confiana . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iPor que Google App Engine (GAE)? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iPor que Python? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iiPblico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iiConhecimento Prvio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iiCdigo Fonte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iiiOrganizao do Contedo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iii

    Ambiente de Desenvolvimento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1Interpretador Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1Terminal de Comando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2Pycharm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4Publicao (Deploy) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5Windows e Mac . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11Questes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12Respostas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

    Webapp2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14O que Webapp2? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14Arquivo app.yaml . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15Roteamento via Webapp2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18Request . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20Response . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21Redirect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23Questes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24Respostas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

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

    Relao de ConfianaDurante minha vida passei por algumas situaes e precisei de ajuda. E por isso fui salvo pelaeducao. Se voc no pode pagar, envie um email para [email protected] para poder adquirir olivro de forma legal.Em contrapartida peo o seguinte, na base da confiana:

    1. Curta a fan page;2. Divulgue o livro entre seus amigos;3. Envie sua opinio aps a leitura, permitindo sua divulgao;4. 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 jdesenvolvia 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 quea estrutura escolhida no suportaria o volume esperado de fotos. Era poca da exploso dos sites decompras coletivas e meus clientes pretendiam fazer promoes.Foi ento que num almoo meu amigo Reginaldo me apresentou a soluo: App Engine. Para meconvencer, ele fez um Hello World em 5 minutos, incluindo o deploy. Aliado simplicidade vinhaa 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.htmlhttps://www.facebook.com/pythonappenginehttp://www.picpro.com.br

  • Prefcio ii

    Groupon. A promessa foi cumprida e o GAE aguentou todos picos de transferncia de arquivos. Athoje 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 deparadima. E como toda mudana, levou certo tempo para me acostumar.Mas apesar das diferenas, as vantagens se mostraram maiores que os problemas. E isso quemostrarei. Abordarei no s conceitos e exemplos simples, mas apresentarei solues para problemasreais 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 projetonessa linguagem. Contudo o GAE era muito diferente do que estava acostumado. No permitia ouso de vrios frameworks consagrados, como o Hibernate.Resolvi ento testar a linguagem Python, a primeira suportada pela plataforma. Mais do que resolvero problema de desenvolvimento, me apaixonei pela linguagem e por sua comunidade. Ela mepermitiu ser mais expressivo, exigindo a escrita de muito menos cdigo. Portei o Pic Pro para Pythonem 1 semana. A quantidade de cdigo diminuiu 65%.Desde ento trabalho sempre com Python, tanto para desenvolvimento de aplicaes comerciaiscomo para ensinar. Ela excelente para iniciantes que desejam aprender programao de umamaneira prtica, simples e expressiva.

    PblicoEste livro foi escrito para quem deseja aprender a fazer uma aplicao completa para internet. Maisdo 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 ferra-mentas 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 nopossui algum deles, pesquise cada assunto somente quando necessrio para entender os exemplos.

    http://hibernate.org/

  • Prefcio iii

    Cdigo FonteTodo 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 ContedoO contedo est organizado nos seguintes captulos:

    1. Ambiente de Densenvolvimento: como montar o ambiente local de desenvolvimento;2. Webapp2: apresentao do framework web Webapp2;3. Tekton: apresentao do framework web Tekton;4. Testes Automatizados: como testar automaticamente sua aplicao;5. Frontend: linguagem de template e arquivos estticos;6. Banco de Dados: persistncia de dados utilizando o Big Table;7. Camada de Negcio: arquitetura para camada de negcios com GaeBusiness;8. Usurios: login e controle de acesso de usurios;9. Upload e Download: upload e download de arquivos;10. Agendamento e Fila de Tarefas: fila e agendamentos de tarefas para processamento;11. 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 DesenvolvimentoSe quiser derrubar uma rvore emmetade do tempo, passe o dobro do tempo amolando omachado.- Provrbio chins de autor desconhecido

    IntroduoO ambiente de desenvolvimento o conjunto de ferramentas que o desenvolvedor utiliza paraconstruir software em seu computador. Ambientes complexos, com erros ou que demoram a executarsuas tarefas comprometem profundamente a produtividade. Por isso, como no caso do machado daparbola, 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 IntegratedDevelopment Enviroment), o Pycharm.Em caso de dificuldade, assista s duas primeiras vdeo-aulas na internet.

    Interpretador PythonAtualmente 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. OApp 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 dedownloads e escolha a verso adequada ao seu Sistema Operacional.Para verificar aquela que est instalada em seu sistema, abra um terminal de comando e digitepython. A verso disponvel impressa como primeira linha aps a execuo, conforme a listagem1.01 a seguir:

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

  • Ambiente de Desenvolvimento 2

    Listagem 1.01: Execuo do PythonPython 2.7.3 (default, Sep 26 2013, 20:03:06)[GCC 4.6.3] on linux2Type "help", "copyright", "credits" or "license" for more information.>>>

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

    Terminal de ComandoPara ser possvel emular e desenvolver a aplicao em um computador, necessrio instalar o Kitde Desenvolvimento Padro (SDK, do ingls Standard Development Kit). Ele prov as ferramentasnecessrias para inicializao do servidor localmente, interao com banco de dados, entre outrasque sero vistas nesse livro.Assim como o interpretador, o endereo de instalao tambm deve ser adicionado ao path. Parafazer isso no Linux, acesse a sua pasta home e utilize o atalho Crtl+h para visualizar os arquivosocultos. Dentre esses arquivos se encontram dois de interesse: o .bashrc e o .profile. Edite essesarquivos adicionando em seus finais as seguintes linhas:Listagem 1.02: Adio de varivel de Ambiente no Linuxexport GAE_SDK="seu diretorio"/google_appenginePATH=$PATH:$GAE_SDK

    Na listagem 1.03 se encontra um exemplo para um SDK que foi instalado em diretrio bin localizadona 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_completionfi

    export GAE_SDK=/home/renzo/bin/google_appenginePATH=$PATH:$GAE_SDK

    https://developers.google.com/appengine/downloads?hl=pt-br

  • Ambiente de Desenvolvimento 3

    Ol Mundo - TerminalDentro da pasta do Kit de Desenvolvimento existe uma diretrio com ummodelo de projeto. Acesse-o e copie a pasta new_project_template para um endereo de sua preferncia. A figura 1.01 a seguirmostra 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 comandodev_appserver.py.A figura 1.02 mostra o console no caso de execuo correta do programa. A partir desse momento oSDK est servindo a aplicao localmente. Acesse o endereo http://localhost:8080 em seu navegadore 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 4

    PycharmApesar 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 IntegratedDevelopment Enviroment) Pycharm. Outros tambm podem ser utilizados , como o Pydev, queinclusive 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 inglsJava Virtual Machine). Aps baixar o pacote adequado ao seu sistema tambm necessrio adicion-lo 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_45PATH=$PATH:$JAVA_HOME/bin

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

    Listagem 1.05: Execuo do script pycharm.sh

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

    Ol Mundo - IDEAo iniciar a IDE, clique em Create New Project e escolha o tipo de projetoGoogle App Engine project.Voc deve assinalar um identificador para o seu projeto e informar o diretrio onde se encontra oSDK 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 5

    Figura 1.03: Novo projeto GAE - Pycharm

    Para executar o servidor local, basta clicar no cone verde play que se encontra em destaque nafigura 1.4.Verique se no link http://localhost:8080 , utilizando seu navegador web, aparece a mensagem HelloWorld. 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 aprenderemcomo inicializar o servidor localmente. Contudo o processo de publicao do site um passofundamental. Somente dessa maneira os usurios podem acessar o site pela rede.

  • Ambiente de Desenvolvimento 6

    O deploy deve ser simples em um bom processo de desenvolvimento, de preferncia com apenas umclique 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, mesmoque seja apenas para imprimir umamensagem simples. Afinal de contas, no faz sentido desenvolverum site se no for possvel disponibiliz-lo na rede. Como afirmaram Jez Humble e Dave Farley emseu livro Entrega Contnua: Atualmente muitas companhias esto fazendo mltiplos deploys emapenas um dia. Foge ao escopo desse livro implementar o processo automatizado. Contudo fazero deploy manualmente, antes do desenvolvimento em si, o primeiro passo nesse sentido.

    Painel de ControlePara publicao, necessrio que voc crie uma aplicao no Painel de Controle do Google AppEngine. 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 atribuaum nome aplicao, como na figura 1.05. Finalize o cadastro clicando novamente em CreateApplication.

    These days, many companies are putting out multiple releases in a day. Continuous Delivery, p. xxiii

  • Ambiente de Desenvolvimento 7

    Figura 1.05: Formulrio App Engine

    Cadastrada a aplicao, edite o arquivo de configurao app.yaml que se encontra na raiz de seuprojeto. Copie o identificador na primeira linha, no item application. Um exemplo da primeiralinha do arquivo se encontra na listagem 1.06:Listagem 1.06: Primeira linha do arquivo app.yamlapplication: 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 jcadastrado o convide, via painel de adminstrao, para ser administrador de um projeto jexistente. No caso desses convites, a verificao no necessria.

    Deploy - Terminal de ComandoEditado o arquivo app.yaml, navegue at o diretrio do projeto no terminal e utilize o comandoupdate do script appcfg.py do SDK:

  • Ambiente de Desenvolvimento 8

    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 utilizoupara criar a aplicao no painel de controle. Com esse comando o SDK ir scannear os arquivos doprojeto e envi-los ao servidor.Finalizada a publicao, voc consegue acessar o site atravs do endereo http://.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 desegurana.

    Deploy via PycharmPara 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 9

    Figura 1.07: Deploy via Pycharm

    Insira suas credenciais. Finalizado o processo, possvel acessar o site no endereo supracitado.

    Para quemusa 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 desegurana.

    Windows e Maco SDK oferece uma Interface Visual(GUI, do ingls General User Interface) que pode ser utilizadaem opo linha de comando para o Sistema Operacional Windows e para o Mac. Para criar umnovo 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 clicandono boto com esse nome. importante notar que a utilizao da IDE Pycharm faz com que odesenvolvimento ocorra da mesma forma nos diferentes sistemas operacionais. Por isso ele serutilizado como base para os exemplos.

  • Ambiente de Desenvolvimento 11

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

  • Ambiente de Desenvolvimento 12

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

  • Ambiente de Desenvolvimento 13

    Respostas1. 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 vantagemde colocar ferramentas no path do SistemaOperacional 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 independetede sistema operacional.

    6. O arquivo de configurao de uma aplicao App Engine se chama app.yaml7. O domnio padro para acessar aplicaes App Engine na internet appspot.com

  • Webapp2Linguagem no simplesmente um dispositivo para relatar experincias, mas um framework queas define. - Benjamin Whorf

    IntroduoA palavra framework signifca um esquema, um conjunto de passos, que serve para resolverdeterminado problema. Apesar do termo ser geral, ele muito utilizado em computao comosinnimo de biblioteca. Ou seja, um conjunto de cdigos que se utilizados facilitam a construode um sistema.Por conta disso, importantssimo saber quais so as questes que um framework busca resolver. Sealgum pedisse para uma pessoa se vestir a carter, a pergunta bvia seria: Qual a ocasio?. Sendoassim, seguir os passos de uma biblioteca sem saber seu objetivo anlogo a ir vestido de fraque emuma partida de futebol.Nesse captulo ser explicado o funcionamento do frameworkWebapp2 e seu objetivo, que abstrairo protocolo HTTP, oferecendo interfaces para receber requisies dos usarios e enviar respectivasrespostas.

    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 outrasplataformas 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.yamlNo projeto criado no captulo anterior existe um arquivo de configurao chamado app.yamlconforme listagem 2.01:

    Listagem 2.01: Arquivo app.yaml

    application: new-project-templateversion: 1runtime: python27api_version: 1threadsafe: yes

    libraries:- name: webapp2

    version: "2.5.2"

    handlers:- url: /favicon\.ico

    static_files: favicon.icoupload: favicon\.ico

    - url: .*script: main.app

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

    Cabealho InicialNo cabealho inicial do arquivo se encontram informaes bsicas sobre o projeto, conformelistagem 2.02:

    Listagem 2.02: Cabealho

    1 application: new-project-template2 version: 13 runtime: python274 api_version: 15 threadsafe: yes

  • Webapp2 16

    Na linha 1, application, consta o identificador da aplicao. Conforme foi visto na seo deploy docaptulo 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 vriasverses 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 doendereo http://picprolabs.appspot.com. Para acessar diferentes verses, como a 16 por exemplo, seunmero deve ser concatenado ao incio do domnio. Uma primeira forma de fazer isso acessaro 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 segurovia https.Cabe ressaltar que esse funcionalidade muito til para se testar a aplicao antes de torn-ladisponvel aos clientes. Ou seja, publica-se o site em uma verso especfica, alterando a verso noarquivo de configurao. Suas funcionalidades so conferidas e homologadas no respectivo endereodedicado. Em caso de sucesso, a nova verso definida como padro, ficando disponvel a todosusurios. 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 daaplicao pode processar requisies em paralelo.

    Bibliotecas EmbutidasO GAE fornece um conjunto de bibliotecas embutidas. Para instalao, deve ser editada a seolibraries do arquivo de configurao, conforme listagem 2.03.Cada item define o nome da biblioteca a ser instalada e, opcionalmente, sua respectiva verso. Noexemplo foi instalada a verso 2.5.2 da biblioteca Webapp2.

    Listagem 2.03: Instalao do framework Webapp2

    1 libraries:2 - name: webapp23 version: "2.5.2"

    Roteamento via Arquivo de Configurao

    Roteamento uma questo a ser resolvida por qualquer framework web. ele quem define qualcdigo ser executado no servidor de acordo com o path acessado no navegador. O incio doroteamento se d na defino da seo handlers no arquivo de configurao, conforme listagem2.04:

    Listagem 2.04: Roteamento

    1 handlers:2 - url: /favicon\.ico3 static_files: favicon.ico4 upload: favicon\.ico56 - url: .*7 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 respectivaao 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 aexecuo 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 expressoregular .*. Essa expresso se traduz como: qualquer cadeia de carateres. Cabe ressaltar que oshandlers so processados na ordem em que aparecem. Por essa razo o primeiro trata a chamadaem /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 seradicionados ao arquivo para processar outros endereos.

    Roteamento via Webapp2Uma 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 # -*- coding: utf-8 -*-2 from __future__ unicode_literals3 import webapp2456 class HomeHandler(webapp2.RequestHandler):7 def get(self):8 self.response.write('Ol Mundo!')91011 app = webapp2.WSGIApplication([('/', HomeHandler)],12 debug=True)

  • Webapp2 19

    Na linha 3 importado o mdulo webapp2 pertecente ao framework de mesmo nome. Como sequer construir um handler para tratar requisies, construida a classe HomeHandler herdando deRequestHandler na linha 6. Nessa classe foi sobrescrito o mtodo referente ao respectivo verboHTTP. 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. Sendoassim, apenas acrescentar o script no arquivo de configurao no suficiente para se saber qualhandler deve ser executado. Por essa razo necessrio fazer tambm o roteamento dentro docdigo, como consta na linha 12. Nela criado o parmetro app construindo-se um objeto do tipoWSGIApplication.O primeiro parmetro da construo uma lista de tuplas, onde o primeiro argumento a expressoregular mapeando os paths. No exemplo, est sendo mapeada a raz do projeto '/'. J o segundoparmetro 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 Mundono 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.py1 class HomeHandler(webapp2.RequestHandler):2 def get(self):3 self.response.write('Ol Mundo!')456 class OutroHandler(webapp2.RequestHandler):7 def get(self):8 self.response.write('Ol Wepapp2!')91011 app = webapp2.WSGIApplication([('/', HomeHandler)], debug=True)12 app = webapp2.WSGIApplication([('/', HomeHandler),('/outra', OutroHandler)],13 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.

    RequestQuando o usurio acessa um site no navegador, ele est enviando uma requisio HTTP. OWebapp2processa essa requisio, construindo um objeto do tipo Request. atravs dessa inteface que ocdigo 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 localizadaaps o sinal ?. Sendo assim. quando se faz uma chamada HTTP do tipo GET possvel editaros valores enviados modificando a url no navegador. Na figura 2.05 consta um exemplo onde sopassados 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 requisiessempre so do tipo string. A listagem 2.06 apresenta o cdigo do handler com os mtodos get, naslinhas 3 e 4, em destaque:

  • Webapp2 21

    Listagem 2.06: Handler com extrao de parmetros1 class ParametrosHandler(webapp2.RequestHandler):2 def get(self):3 nome = self.request.get('nome')4 sobrenome = self.request.get('sobrenome')5 self.response.write('Ol %s %s!' % (nome, sobrenome))

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

    ResponseAps o recebimento de uma requisio, o servidor deve enviar uma resposta utilizando protocoloHTTP. Para cumprir esse objetivo utilizado o objeto do tipo Response. Ele prov mtodos paraauxiliar no envio de dados.Nos exemplos anteriores seu mtodo write foi utilizado para enviar uma string como resposta srequisies. 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 strings1 class ParametrosHandler(webapp2.RequestHandler):2 def get(self):3 nome = self.request.get('nome')4 sobrenome = self.request.get('sobrenome')5 self.response.write('Ol %s %s!' % (nome, sobrenome))

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

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

  • Webapp2 22

    Listagem 2.08: Mtodo redirect

    1 class RedirecionaParaOutroHandler(webapp2.RequestHandler):2 def get(self):3 self.redirect('/outra')456 class GoogleHandler(webapp2.RequestHandler):7 def get(self):8 self.redirect(str('http://www.google.com'))91011 app = webapp2.WSGIApplication([('/', HomeHandler),12 ('/outra', OutroHandler),13 ('/redirecionar', RedirecionaParaOutroHandler),14 ('/google', GoogleHandler),15 ('/parametros', ParametrosHandler)],16 debug=True)

    Dessa maneira, ao acessar http://localhost:8080/redirecionar, o usurio ser redirecionadopara http://localhost:8080/outra. Por outro lado, se acessar http://localhost:8080/google,ser redirecionado para http://www.google.com.

    importante ressaltar que emum redirecionamento enviada uma respotaHTTP de cdigo30x. Portanto, existe trafgo de dados durante essa operao. Devem ser evitados mltiplosredirecionamentos consecutivos, pois a maioria dos navegadores no permitem mais doque 5 redirecionamentos encadeados. O objetivo evitar o redirecionamento infinito econsumo excessivo de recursos de rede.

  • Webapp2 23

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

  • Webapp2 24

    Questes1. Qual o nome do arquivo de configurao do Google App Engine?2. Para que serve o item application do arquivo de configurao?3. Para que serve o item version do arquivo de configurao?4. Qual endereo deve ser utilizado para acessar uma aplicao com id foo e verso 35?5. Para que serve a seo libraries do arquivo de configurao?6. Para que serve a seo handlers do arquivo de configurao?7. Como so definidos os paths mapeados no arquivo de configurao?8. Por que necessrio mapear RequestHandlers nos scripts Python?9. Para que serve a classe RequestHandler?10. Como se relacionam os mtodos da classe RequestHandler e os do protocolo HTTP?11. Para que serve o objeto Request?12. 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

    Respostas1. 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 dapublicao do site.

    4. O endereo para acessar a aplicao foo em sua verso 35 deve ser http://35.foo.appspot.com.brou http://35-dot-foo.appspot.com.br. recomendado utilizar a segunda forma para evitarproblemas quando o acesso for feito via https.

    5. A seo libraries serve para configurar as bibliotecas a serem utilizadas na aplicao. OGAE 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 como 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 deconfigurao no suficiente para definir qual classe ser utilizada para processar umarequisio.

    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 serprocessada no mtodo sobrescrito get, Uma chamada do tipo POST em um mtodo post eassim or diante.

    11. O objeto Request serve como interface para acesso s informaes sobre uma requisioHTTP.

    12. Os valores de parmetros enviados via query string em uma chamada HTTP do tipo GET soobtidos utilizando-se o mtodo get do objeto Request. A ele deve ser fornecido o nome doparmetro do qual se quer extrair o valor.

    13. O objeto Response server como interface para construo de uma resposta HTTP. Ela contmos 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 omtodo redirect do objeto

    RequestHandler, fornecendo como parmetro o path desejado, no caso de redirecionamentopara a mesmo aplicao, ou a url completa em caso contrrio.

    ndice analticoPrefcioRelao de ConfianaPor que Google App Engine (GAE)?Por que Python?PblicoConhecimento PrvioCdigo FonteOrganizao do Contedo

    Ambiente de DesenvolvimentoIntroduoInterpretador PythonTerminal de ComandoPycharmPublicao (Deploy)Windows e MacResumoQuestesRespostas

    Webapp2IntroduoO que Webapp2?Arquivo app.yamlRoteamento via Webapp2RequestResponseRedirectResumoQuestesRespostas