appengine sample

52

Upload: lauro-jardim

Post on 08-Nov-2015

43 views

Category:

Documents


8 download

DESCRIPTION

python

TRANSCRIPT

  • App Engine e PythonVoc programa e o Google escala!

    Renzo NuccitelliEsse livro est venda em http://leanpub.com/appengine

    Essa verso foi publicada em 2015-05-07

    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 - 2015 Renzo Nuccitelli

  • Tweet Sobre Esse Livro!Por favor ajude Renzo Nuccitelli a divulgar esse livro no Twitter!O tweet sugerido para esse livro :Confira esse livro fantstico sobre Aplicaes WEB: App Engine e Python!A hashtag sugerida para esse livro #appengineescala.Descubra o que as outras pessoas esto falando sobre esse livro clicando nesse link para buscar ahashtag no 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 o 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 e Vdeo Aulas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iiiOrganizao do Contedo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iii

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

    Webapp2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13O que Webapp2? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13Arquivo app.yaml . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14Roteamento via Webapp2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17Request . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19Response . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20Redirect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22Questes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23Respostas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

    Tekton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

  • CONTEDO

    Setup inicial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25Virtualenv . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26Script convention.py . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32Roteamento via Tekton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34Recebimento de Parmetros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36Configuraes Globais e Internacionalizao . . . . . . . . . . . . . . . . . . . . . . . . . 36Injeo de Dependncia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38Redirecionamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41Questes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42Respostas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43

  • 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 gratuitamente 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 e linux.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 neles.Foi ento que num almoo meu amigo Reginaldo me apresentou a soluo: Google App Engine(GAE). Para me convencer, 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.renzo.pro.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 deparadigma. 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?

    poca do projeto supracitado eu era fluente apenas em Java. Por conta disso, iniciei o projeto nessalinguagem. Contudo o GAE era muito diferente do que estava acostumado. No permitia o uso devrios 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 ideia em um produto web rapidamente,sem ter que aprender a complexa arte de escalar servidores.A documentao do GAE excelente, objetiva e centralizada. Contudo, muitas vezes apresentaferramentas superficialmente. Sendo assim, esse livro uma excelente fonte para voc ir alm dobsico, 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 Fonte e Vdeo AulasTodo cdigo fonte contido no livro livre e pode ser encontrado em https://github.com/renzon/appengineepython. Alm disso vdeos aulas gratuitas podem ser encontradas em https://www.youtube.com/playlist?list=PLA05yVJtRWYRGIeBxag8uT-3ftcMVT5oF

    Organizao do ContedoO contedo est organizado nos seguintes captulos:

    1. Ambiente de Desenvolvimento: como montar o ambiente local de desenvolvimento;2. Webapp2: apresentao do framework web Webapp2;3. Tekton: apresentao do framework web Tekton;4. Frontend: linguagem de template e arquivos estticos;5. Usurios e Segurana: Login de usurios, segurana e controle de permisses;6. Banco de Dados: persistncia de dados utilizando o Big Table;7. Arquitetura de Apps: arquitetura para camada de negcios com GaeBusiness;8. AJAX com AngularJS: chamadas AJAX com uso do framework AngularJS;9. Agendamento, Fila de Tarefas e Email: fila e agendamentos de tarefas para processamento e

    envio email;10. Servios Remotos: acesso a servios de outros sites (web services);11. Upload e Download: upload e download de arquivos;12. Testes Automatizados: como testar automaticamente uma aplicao.

    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.

    Interpretador PythonAtualmente existem duas principais verses da linguagem: 2.7 e 3.4. 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 (Ubuntu verso 12.04) 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 digitepython. A verso disponvel impressa como primeira linha aps a execuo, conforme exemplo aseguir:

    http://www.python.org/getit/

  • Ambiente de Desenvolvimento 2

    Execuo do Python via linha de comando no Ubuntu 12.04Python 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 outras.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:Adio de varivel de Ambiente no Linuxexport GAE_SDK="seu diretorio"/google_appenginePATH=$PATH:$GAE_SDK

    A seguir se encontra um exemplo para um SDK que foi instalado em diretrio bin localizado napasta home:Arquivo .bashrc editado para incluir SDK ao 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

    Cabe ressaltar que a varivel GAE_SDK no obrigatria. Contudo, ela ser utilizada no captulo deTestes Automatizados. E por ser parte da configurao, ela j foi aqui inserida.

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

  • Ambiente de Desenvolvimento 3

    Ol Mundo - TerminalDentro da pasta do Kit de Desenvolvimento existe um diretrio contendo um modelo de projeto.Acesse-o e copie a pasta new_project_template para um endereo de sua preferncia. A figura1.01 a seguir mostra o contedo do SDK aps extrao do arquivo zipado:

    Figura 1.01: Contedo SDK GAE

    Copiada a estrutura do projeto, navegue at seu diretrio no terminal e digite o seguinte comandodev_appserver.py . para iniciar o servidor localmente.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.

  • Ambiente de Desenvolvimento 4

    Figura 1.02: Comando dev_appserver.py

    Observe que a primeira opo depois do comando o diretrio onde se encontra o arquivo deconfigurao app.yaml. Sendo assim, tambm funcionaria o comando dev_appserver.py new_-project_template se executado direto do diretrio home.

    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 ser robusto e por seu conjunto de ferramentas.Para conseguir executar o Pycharm necessrio instalar a Mquina Virtual Java (JVM, do inglsJava Virtual Machine). Aps baixar o pacote adequado ao seu sistema tambm necessrio adicion-lo ao path. As seguintes linhas devem ser adicionadas aos arquivos .bashrc e .profile, onde a varivelJAVA_HOME deve apontar para o diretrio onde foi extrado o JDK:Arquivo .bashrc editado para colocar JDK no pathexport 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 noterminal e rode o script pycharm.sh. Exemplo de execuo do comando $ ./bin/pycharm-3.0.1/bin/pycharm.sh . Com o ambiente inicializado voc pode fixar seu cone na barra de tarefaspara poder inicializar a aplicao apenas com um clique.

    Prefira baixar a verso profissional do Pycharm, pois a verso gratuita no possui algunsplugins, como o destinado a construo e aplicaes Google App Engine.

    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

    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:

    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, aparece a mensagem HelloWorld. Em caso negativo, confira e repita os passos anteriores.

    Figura 1.04: Iniciando 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 acess-lo pela rede.O deploy deve ser simples. Em um bom processo de desenvolvimento, deve ser possvel publicarapenas com um clique ou comando. Mais do que isso, o site deve ser publicado de maneira

  • Ambiente de Desenvolvimento 6

    frequente. Por essa razo, recomenda-se iniciar o desenvolvimento apenas aps a publicao dosite pela primeira vez, mesmo que seja apenas para imprimir uma mensagem simples. Afinal decontas, no faz sentido desenvolver um site se no for possvel disponibiliz-lo. Como afirmaramJez Humble e Dave Farley em seu livro Entrega Contnua: Atualmente muitas companhias estofazendo mltiplos deploys em apenas um dia. Foge ao escopo desse livro implementar o processoautomatizado. Contudo, fazer o deploy manualmente, antes do desenvolvimento em si, o primeiropasso nesse sentido.

    Painel de ControlePara publicao, necessrio a criao de uma aplicao no Painel de Controle do Google AppEngine. Isso deve ser feito no endereo http://appengine.google.com. Ser necessrio utilizar umaConta Google. Aps o cadastro, ser possvel visualizar o painel.Clicando Create Application uma nova aplicao gerada. Um identificador nico e um nomedevem ser atribudos aplicao, como na figura 1.05:

    Figura 1.05: Formulrio App Engine

    Cadastrada a aplicao, o arquivo de configurao app.yaml que se encontra na raiz de seu projetodeve ser editado. O identificador deve ser copiado na primeira linha, no item application. Umexemplo da primeira linha do arquivo se encontra a seguir:

    Primeira linha do arquivo app.yaml

    application: cursospythonpro

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

  • Ambiente de Desenvolvimento 7

    Para usar o App Engine a conta Google precisa ser verificada por celular atravs de umsms. Usurios j se queixaram dessamensagem nunca chegar para clientes da operadora Oi.Para evitar isso, pode ser utilizado um celular de outra operadora. Outra opo pedir paraalgum j cadastrado enviar um convite, via painel de administrao, para administraode um projeto j existente. Nesse caso, a verificao no necessria.

    Deploy - Terminal de ComandoEditado o arquivo app.yaml, deve ser acessado o diretrio do projeto no terminal e digitado ocomando update do script appcfg.py do SDK:Deploy via bash~$ cd PycharmProjects/cursospythonpro//PycharmProjects/cursospythonpro$ appcfg.py update .

    O programa pedir e-mail e senha. Devem ser inseridos os dados relativos conta que se utilizoupara criar a aplicao no painel de controle. Com esse comando o SDK ir escanear os arquivos doprojeto e envi-los ao servidor.Finalizada a publicao, possvel acessar o site atravs do endereohttp://seu_identificador.appspot.com,conforme imagem 1.06:

    Figura 1.06: Site publicado no App Engine

    Para quem usa login em dois passos, deve ser utilizado o comando appcfg.py update. --oauth2. Ser exibida a tela de login no navegador onde possvel inserir a senha e ocdigo de segurana.

    http://www.google.com/intl/pt-PT/landing/2step/

  • Ambiente de Desenvolvimento 8

    Deploy via PycharmPara fazer o deploy com o Pycharm, o menu Tools > Google App Engine > Deploy Application deveser acessado, conforme figura 1.07:

    Figura 1.07: Deploy via Pycharm

    Devem ser inseridas as credenciais. Finalizado o processo, possvel acessar o site no endereosupracitado.

    Para quem usa login em dois passos, a opo Use Passwordless login via OAuth2 deser escolhida. Ser exibida a tela de login no navegador onde possvel inserir a senha e ocdigo de segurana.

    Windows e Maco SDK oferece uma Interface Visual (GUI, do ingls Graphical User Interface) que pode ser utilizadaem opo linha de comando para os Sistemas Operacionais Windows Mac OS. Clicando em emFile > Add new Application um novo projeto criado, como na figura 1.08:

    http://www.google.com/intl/pt-PT/landing/2step/

  • Ambiente de Desenvolvimento 9

    Figura 1.08: GUI do App Engine

    Criado o projeto possvel iniciar 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.Outra fator interessante que ao instalar no Mac, ele informa que criar um link simblico paraa pasta do SDK. Esse link se encontra em /usr/local/google_appengine e deve ser utilizado quandonecessrio para referenciar as bibliotecas da plataforma.

  • Ambiente de Desenvolvimento 10

    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 11

    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 12

    Respostas1. As duas principais verses atuais do interpretador Python so 2.7 e 3.4.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 poder 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 independentede 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 significa 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 framework Webapp2 e seu objetivo.

    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 integrao 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, utilizando objetos como Request,

    Response e Handler.

    A seguir constam sees explicando os diferentes componentes dessa ferramenta.Language is not simply a reporting device for experience but a defining framework for it.

  • Webapp2 14

    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 15

    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 corretamente na nuvem.J na linha 2 consta a verso da aplicao. importante notar que o GAE permite a existncia devrias 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 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 essa 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.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.

  • Webapp2 16

    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 definio 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:

    Figura 2.02: favicon.ico

  • Webapp2 17

    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 caracteres. 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)

    Na linha 3 importado o mdulo webapp2 pertencente ao framework de mesmo nome. Como sequer construir um handler para tratar requisies, construda 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 tipo

    WSGIApplication.

  • Webapp2 18

    O primeiro parmetro da construo uma lista de tuplas, onde o primeiro argumento a expressoregular mapeando os paths. No exemplo, est sendo mapeada a raiz 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 no Cdigo 2.01:

    Cdigo 2.01: Script main.py

    1 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:

    Figura 2.04: Mensagem Ol Webpp2! no navegador

    Dessa maneira, os passos para se fazer o roteamento so:

  • Webapp2 19

    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 interface 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. O cdigo 2.02 apresenta o handler com os mtodos get, nas linhas 3 e 4,em destaque:

    Cdigo 2.02: Handler com extrao de parmetros

    1 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 extradas 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.

  • Webapp2 20

    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. O cdigo 2.03 contm lgica que se utiliza desse mtodo, na linha 5, em destaque:

    Cdigo 2.03: Mtodo write para escrita de strings

    1 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 deum endereo interno da aplicao, apenas o path precisa ser utilizado. O cdigo 2.04 contm cdigoexemplificando os dois casos:

    Cdigo 2.04: 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'))910

  • Webapp2 21

    11 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 em um redirecionamento enviada uma resposta HTTP decdigo 30x. Portanto, existe trfego de dados durante essa operao. Devem ser evitadosmltiplos redirecionamentos consecutivos, pois a maioria dos navegadores no permitemmais do que 5 redirecionamentos encadeados. O objetivo evitar o redirecionamentoinfinito e consumo excessivo de recursos de rede.

  • Webapp2 22

    ResumoNesse captulo foi apresentado um resumo do framework de cdigo aberto Webapp2. Atravs deseus 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 abstrairo protocolo HTTP. Sendo assim, precisamos apenas conhecer seus componentes para construir umweb site. Apesar de simples, os poucos componentes vistos so suficiente para construirmos toda anavegao de uma aplicao.O Webapp2 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 23

    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 24

    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 mapear RequestHandlers nos scripts Python porque comum a definio

    de mltiplas classes em um arquivo. Sendo assim somente 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.

  • TektonVoc deve renunciar toda superficialidade, toda conveno, toda presuno e desiluso. - Gustav Mahler

    IntroduoConveno em vez de Configurao (Convention over Configuration) o grande mantra dessecaptulo. Ser explicado o funcionamento do framework Tekton e todas suas convenes. A ideiaprincipal evitar a excessiva configurao do sistema, permitindo o foco em funcionalidades.Diferente da abordagem do captulo anterior, Webapp2, o roteamento e recebimento de parmetrosser feito atravs de convenes. Apesar disso, o conhecimento sobre os objetos bsicos, Request,Response e RequestHandler, ser fundamental.Tekton ser a biblioteca base. Nela sero construdos todos os exemplos de cdigo no restante dolivro.

    Setup inicial

    O repositrio do Tekton consiste em um template para iniciar um novo projeto. possvel copiar essecdigo baixando o arquivo zipado. Aps a extrao, ele apresenta a seguinte estrutura de pastas:

    tekton-master backend

    appengine apps build_*script*s test venv

    A seguir so apresentadas breves descries de cada um dos diretrios:You must renounce all superficiality, all convention, all vanity and delusion.http://github.com/renzon/tektonhttps://github.com/renzon/tekton/archive/master.zip

  • Tekton 26

    1. backend: diretrio raiz de todo cdigo do servidor;2. appengine: aqui se encontram todos arquivos de configurao e integrao com o GAE;3. apps: contm as aplicaes, com suas lgicas de negcio, que compem o sistema;4. build_scripts: possui scripts para gerao de produtos, como arquivos de internacioanalizao;5. test: diretrio com scripts de testes;6. venv: pasta que define o ambiente virtual do sistema.

    Os detalhes sobre essas estruturas sero apresentados nas prximas sees.

    VirtualenvVirtualenv uma biblioteca Python. Ela permite que se crie um ambiente isolado para cada projeto. possvel ento definir qual a verso da linguagem e quais so as bibliotecas externas que seroutilizadas.Instrues de instalao para os sistemas Linux, Mac OS e Windows.

    Virtualenv Linux e Mac OSA instalao do virtualenv no Linux pode ser feita atravs do comando sudo apt-get installpython-virtualenv, sendo necessria a senha de root para instalao.J no Mac OS necessrio instalar a biblioteca utilizando o instalador de pacotes Python (pip). Paraisso, basta instalar a verso 2.7 com o [Homebrew](http://docs.python-guide.org/en/latest/starting/install/osx/:brew install python.Essa verso j inclui o pip em sua instalao. O comando pip install virtualenv deve ento serutilizado para instalar o virtualenv.Depois de instalado o virtualenv, o script de setup do projeto o mesmo para Linux e Mac. Apasta venv do projeto contm o script venv.sh. Ele cria o ambiente isolado e instala as bibliotecasnecessrias. Um exemplo de execuo do script exibido a seguir:Execuo do script venv.sh~/PycharmProjects/appengineepython$cd backend/venv/~/PycharmProjects/appengineepython/backend/venv$./venv.sh

    Como as dependncias necessrias so baixadas da internet, necessria conexo com a internet.

    Virtualenv WindowsPara instalar o virtualenv no Windows se faz necessrio a instalao do pip, uma biblioteca pythonpara instalao de pacotes. Para isso deve ser baixado o script Python get_pip.py. Depois o scriptdeve ser executado com o interpretador Python, conforme exemplo a seguir:

    https://raw.github.com/pypa/pip/master/contrib/get-pip.py

  • Tekton 27

    Execuo do script get_pip.sh

    C:\Users\renzovm>cd DesktopC:\Users\renzovm\Desktop>python get_pip.pyDownloading/unpacking pipDownloading/unpacking setuptoolsInstalling collected packages: pip, setuptoolsSuccessfully installed pip setuptoolsCleaning up...

    Aps a instalao o pip deve ser adicionado ao path. Para isso deve ser aberto o explorer e utilizado oboto direito do mouse para clicar em computador. Depois deve ser acessado o menu propriedades,Configuraes Avanadas de Sistema, e na poro Variveis do Sistema a varivel Path deveser editada para conter em seu final o diretrio de instalao do pip. No caso da instalao padro,esse endereo C:\Python27\Scripts. A figura 3.01 exemplifica o processo:

    Figura 3.01: Adicionado pip ao path

    O instalador atual do Python 2.7.9 para Windows j vem com pip instalado por padro.Alm disso, no processo de instalao possvel marcar opo para adio automtica doPython ao path, evitando todo o trabalho manual.

    Com o pip instalado deve ser executado o comando pip install virtualenv para instalar ovirtualenv. Finalmente com o virtualenv instalado e o template de projeto extrado na rea de

  • Tekton 28

    Trabalho possvel criar o ambiente isolado para o projeto atravs da linha de comando. Pararodar o comando necessrio abrir o prompt como administrador. Para isso, clique no menu Iniciar,digite cmd. Mantenha pressionadas as teclas Crtl + Shift e ento pressione enter:

    Criao de virtualenv

    C:\Users>cd renzovmC:\Users\renzovm>cd DesktopC:\Users\renzovm\Desktop>cd appengineepythonC:\Users\renzovm\Desktop\appengineepython>cd backendC:\Users\renzovm\Desktop\appengineepython\backend>cd venvC:\Users\renzovm\Desktop\appengineepython\backend\venv>venv.bat

    Ao trmino da execuo, o ambiente virtual ser criado e as bibliotecas necessrias instaladas.

    Arquivo requirements.txtAs dependncias de bibliotecas externas do projeto se encontram em dois arquivos: require-ments.txt e dev_requirements.txt, presentes no diretrio venv. No primeiro se encontram asdependncias necessrias ao funcionamento do servidor:

    Arquivo requirements.txt

    tekton==4.0gaebusiness==4.4.2gaecookie==0.7gaeforms==0.5gaegraph==3.0.2gaepermission==0.8pytz==2014.4Babel==1.3python-slugify==0.0.7

    J o arquivo dev_requirements contm dependncias necessrias apenas durante processo dedesenvolvimento. Esse o caso das bibliotecas Mock e Moomygae, utilizadas para facilitar a criaode testes automticos:

  • Tekton 29

    Arquivo dev_requirements.txt-r requirements.txtmock==1.0.1mommygae==1.1

    Esses arquivos podem ser editados para conter dependncias que se julguem necessrias durante odesenvolvimento.

    Links SimblicosEm um servidor comum o processo de instalao de dependncias seria feito com os mesmoscomandos. Contudo, no temos acesso ao Sistema Operacional do GAE. Sendo assim, necessrioinformar ao sistema onde se encontram as bibliotecas, de forma que elas sejam copiadas durante oprocesso de deploy. Alm das bibliotecas, tambm devem ser dispobilizados os cdigos das aplicaespresentes no diretrios apps.Essas tarefas so realizadas pelo script de setup. Ele cria os links simblicos apps e lib na pastaappengine apontado para os diretrios de interesse.

    Virtualenv e PycharmAs aes realizadas at agora serviram apenas para instalar as bibliotecas no projeto. Contudo, oPycharm precisa utilizar o ambiente criado para poder auxiliar no desenvolvimento, oferecendoopes de auto complete referente s bibliotecas e apps.Para isso deve ser acessada a janela de configurao da IDE (cone chave de roda). No input depesquisa deve ser inserida a palavra Interpreter e escolhida a opo Python Interpreters. Deve serpressionado o cone + e escolhida a opo Local..., conforme figura 3.02:

    Figura 3.02: Virtualenv e Pycharm

  • Tekton 30

    Feito isso, deve ser selecionado o ambiente isolado localizado dentro do projeto. No Linux o arquivoa ser escolhido /backend/venv/bin/python. J no Windows ele se encontra em\backends\venv\Scripts\python.exe.Indicado o virtualenv, deve ser editada a localizao do servidor. Para isso deve ser acessado o menuEdit Configurations conforme figura 3.03:

    Figura 3.03: Configurao de servidor no Pycharm

    Uma vez nessa janela, deve ser configurado o diretrio appengine do projeto como Workingdirectory, j que ele contm o arquivo app.yaml. A figura 3.04 mostra a configurao final:

    Figura 3.04: Diretrio do servidor

    Aps toda essa configurao possvel executar o servidor local e verificar a pgina inicial do projetono navegador, conforme figura 3.05:

  • Tekton 31

    Figura 3.05: Hello World Tekton

    Como ltimo passo de configurao, necessrio ento marcar pastas chave como razes de cdigofonte. Isso necessrio para que a IDE consiga inspecionar seus contedos a fim de auxiliar noprocesso de desenvolvimento. A figura 3.06 mostra o menu a ser acessado quando se clica comboto direito do mouse sobre cada um dos diretrios:

  • Tekton 32

    Figura 3.06: Raiz de cdigo fonte

    Os diretrios a serem marcados so:

    1. apps;2. test;3. appengine.

    Apesar de trabalhoso, a parte de configurao do projeto feita somente uma vez. Com os ganhosde produtividade, o tempo gasto na configurao ser recuperado rapidamente durante a fasedesenvolvimento.

    Script convention.pyNo projeto configurado o framework Tekton utiliza os objetos bsicos do Webapp2. Sendo assim, possvel investigar o arquivo de configurao app.yaml para entender seu funcionamento:

  • Tekton 33

    Seo handlers do arquivo app.yaml com Tekton configurado

    handlers:- url: /

    *script*: convention.appsecure: always

    - url: /robots\.txtstatic_files: static/robots.txtupload: static/robots.txt

    - url: /favicon\.icostatic_files: static/img/favicon.icoupload: static/img/favicon.ico

    - url: /static(.*)static_files: static\1upload: static.*

    - url: /[^_].**script*: convention.appsecure: always

    - url: /_ah/warmup*script*: routes.warmup.app

    Da configurao possvel notar que as requisies sero tratadas, com apenas algumas excees,pelo arquivo convention.py. O contedo desse script se encontra no cdigo 3.01.Nas linhas 2 e 3 do arquivo so adicionados os diretrios lib e apps, presentes em appengine, aopath. Essa a razo de se ter criado os links simblicos nesse endereo, na seo de Setup Inicial.Nas linhas 11 e 12 so definidos os parmetros de localizao e fuso horrio da aplicao. Maisdetalhes sobre isso ser visto na seo Arquivo settings.py.Nas demais linhas definido um nico RequestHandler que trata todas requisies. importanteressaltar que tanto chamadas POST e GET so tratadas pelo mesmo mtodo make_convention. Sefor necessrio atender outros mtodos, como o PUT, suficiente editar o arquivo copiando o mtodoget e substituindo seu nome para tambm atender a respectiva chamada HTTP.

  • Tekton 34

    Cdigo 3.01: Script convention.py

    1 # Put lib on path, once Google App Engine does not allow doing it directly2 sys.path.append(os.path.join(os.path.dirname(__file__), "lib"))3 sys.path.append(os.path.join(os.path.dirname(__file__), "apps"))45 import settings6 from tekton.gae import middleware7 import webapp28 from webapp2_extras import i18n910 i18n.default_config['default_locale'] = settings.DEFAULT_LOCALE11 i18n.default_config['default_timezone'] = settings.DEFAULT_TIMEZONE121314 class BaseHandler(webapp2.RequestHandler):15 def get(self):16 self.make_convention()1718 def post(self):19 self.make_convention()2021 def make_convention(self):22 middleware.execute(settings.MIDDLEWARE_LIST, self)232425 app = webapp2.WSGIApplication([("/.*", BaseHandler)], debug=False)

    A ideia geral a delegao do processamento de todas requisies pelo script convention.py, nomais sendo necessrio mapear handlers manualmente. A maneira de se fazer isso ser explicada naprxima seo.

    Roteamento via TektonO roteamento no framework Tekton feito por conveno entre o contedo do pacote routes,presente no diretrio appengine, e os paths da aplicao. Como exemplo inicial, ao se fazer o acesso raiz / do projeto, a biblioteca ir procurar pelo mdulo home.py, dentro do diretrio routes, eexecutar sua funo de nome index. O cdigo 3.02 apresenta o cdigo do arquivo:

  • Tekton 35

    Cdigo 3.02: home.py

    1 @login_not_required2 @no_csrf3 def index():4 return TemplateResponse()

    O resultado da execuo do cdigo foi visto no final da seo de Setup, na figura 3.05, onde apareciaa home do Tekton.No caso do acesso ao path /usuario, a biblioteca ir procurar pelo script usuario.py e executarsua funo index. J o acesso a /usuario/ola acarretar na execuo da funo ola do scriptusuario.py. O arquivo se encontra sob o pacote routes:

    routes/ home.py usuario.py

    O cdigo 3.03 apresenta o contedo do script :

    Cdigo 3.03: script usuario.py

    1 @login_not_required2 @no_csrf3 def index(_resp):4 _resp.write('Pgina de Usurio')567 @login_not_required8 @no_csrf9 def ola(_resp):10 _resp.write('Ol Usurio')

    Ao acessar o link http://localhost:8080/usuario possvel visualizar a mensagem Pgina deUsurio no navegador. De maneira anloga, ao se acessar http://localhost:8080/usuario/olaser visualizada a mensagem Ol Usurio.Seguindo esse esquema de conveno, podem ser criados pacotes, mdulos e funes dentro deroutes. Os scripts sero sempre encontrados de acordo com o path acessado no navegador. Dessamaneira fica dispensada a configurao do roteamento que foi necessria no captulo 2: Webapp2.

  • Tekton 36

    Recebimento de ParmetrosAlm da conveno de rotas, o recebimento de parmetros tambm feito por conveno. Parareceber o valor de um parmetro chamado nome necessrio apenas declarar um argumento demesmo nome. Como exemplo, a funo ola foi alterada conforme cdigo 3.04:Cdigo 3.04: funo ola com parmetro nome1 def ola(_resp, nome):2 _resp.write("Ol %s" % nome)

    A figura 3.07 mostra o resultado da passagem de parmetro via query string:

    Figura 3.07: execuo de ola com parmetro nome igual a Renzo

    Mais parmetros podem ser recebidos acrescentando-se argumentos funo, conforme cdigo 3.05:Cdigo 3.09: funo ola com parmetros nome e sobrenome1 def ola(_resp, nome, sobrenome):2 _resp.write("Ol %s %s" % (nome, sobrenome))

    Acessando o endereo http://localhost:8080/usuario/ola?nome=Renzo&sobrenome=Nuccitelli exibida no navegador a mensagem Ol Renzo Nuccitelli.Cabe ressaltar que a passagem de parmetros pode ser feita de maneira RESTful. Ou seja, a mesmamensagem obtida se os parmetros forem passados atravs do endereo:http://localhost:8080/usuario/ola/Renzo/Nuccitelli. possvel ainda mesclar as duas formas. Como exemplo, o acesso ao endereo:http://localhost:8080/usuario/ola/Renzo?sobrenome=NuccitelliA mensagem seria exatamente a mesma vista anteriormente.

    Configuraes Globais e InternacionalizaoO arquivo settings.py contm as configuraes globais do sistema. Nele possivel alterar endereoresponsvel por envio de emails pelo sistema, idioma, fuso-horrio, entre outras. Como exemplo, oarquivo foi editado para portugus brasileiro e fuso de So Paulo:

  • Tekton 37

    Arquvio setting.py

    1 APP_URL = 'https://tekton-fullstack.appspot.com'2 SENDER_EMAIL = '[email protected]'3 DEFAULT_LOCALE = 'pt_BR'4 DEFAULT_TIMEZONE = 'America/Sao_Paulo'5 LOCALES = ['en_US', 'pt_BR']6 TEMPLATE_404_ERROR = 'base/404.html'7 TEMPLATE_400_ERROR = 'base/400.html'

    Aps alterar o idioma necessrio rodar o script para gerar o arquivo de tradues. O Tekton jpossui embutida biblioteca de internacionalizao, facilitando a construo de sites em mltiplaslnguas. Maiores detalhes sero vistos em captulos posteriores. Por ora, suficiente rodar o scriptbuild_*script*s/babel/i18n_extractor.py. Gerados os arquivos, possvel verificar a home pagetraduzida:

  • Tekton 38

    Figura 3.08: Home em portugus brasileiro

    Injeo de DependnciaO framework Tekton prov um sistema simplificado de injeo de dependncia por conveno denomes. Ao declarar parmetros com identificao especial, a biblioteca injeta objetos de interesseautomaticamente. o caso do parmetro _resp constante no cdigo 3.09, reproduzido abaixo porcomodidade. Atravs dele se tem acesso ao objeto Response, visto em detalhes no captulo 2:Webapp2.

  • Tekton 39

    Cdigo 3.09: funo ola com parmetros nome e sobrenome

    1 def ola(_resp, nome, sobrenome):2 _resp.write("Ol %s %s" % (nome, sobrenome))

    Se fosse necessrio receber tambm o objeto Request como dependncia, seria suficiente acrescentarum segundo parmetro funo, conforme cdigo cdigo 3.10:

    Cdigo 3.10: funo ola com injeo de objetos Response e Request

    1 def ola(_resp, _req, nome, sobrenome):2 _resp.write("Ol %s %s" % (nome, sobrenome))3 # Imprimindo parametros de requisio http4 _resp.write("Parametros: %s" % _req.arguments())

    O underscore _ na frente dos parmetros injetados apenas uma conveno. Ela foiadotada para diferenciar os argumentos que so injetados daqueles que so extrados darequisio HTTP. Dessa maneira possvel perceber no cdigo 3.10 que _resp e _req sodependncias injetadas, enquanto nome e sobrenome so parmetros recebidos via protocoloHTTP.

    Os parmetros injetados devem sempre ser os primeiros argumentos da funo. Sendoassim, no seria possvel trocar de posio os parmetros _resp e nome

    Da mesma forma que foram extradas as dependncias do framework Webapp2, a mesma ideia podeser empregada para outros objetos ou funes. A vantagem dessa tcnica tornar o cdigo testvel.Isso ficar mais claro no captulo de Testes Automatizados.

    RedirecionamentoUma vez que o objeto RequestHandler recebido como injeo de dependncia, para fazer umredirecionamento necessrio apenas receb-lo atravs do parmetro _handler e utilizar seumtodoredirect. O cdigo 3.11 mostra o mtodo redirecionar que redireciona para o path respectivo funo ola:

  • Tekton 40

    Cdigo 3.11: Mtodo Redirecionar com url como string, script usuario.py

    1 @login_not_required2 @no_csrf3 def redirecionar(_handler):4 url = r'/usuario/ola/Renzo/Nuccitelli'5 _handler.redirect(url)

    O problema dessa abordagem que o path inserido como uma string. Se por alguma razo o nomeda funo ola for alterado, o redirecionamento levar a um link quebrado. Por essa razo o Tektonprov uma interface para calcular a url a partir de uma funo.A cdigo 3.12 mostra o cdigo alterado, fazendo uso do mdulo router, presente no pacote tekton,para gerar a url baseada na funo, que seu primeiro parmetro. Nessa abordagem, em caso derefatorao da funo ola, o link do redirecionamento iria ser atualizado automaticamente para oendereo correto.

    Cdigo 3.12: Mtodo Redirecionar com url calculada por tekton.router.py

    1 def redirecionar(_handler):2 url = r'/usuario/ola/Renzo/Nuccitelli'3 url = router.to_path(ola, 'Renzo', 'Nuccitelli')4 _handler.redirect(url)

    Dessa maneira se encerra a explicao das funcionalidades bsicas da biblioteca.

  • Tekton 41

    ResumoNesse captulo foi abordado o framework Tekton. Foi utilizado o virtualenv para sua instalao e oarquivo requirements.txt para resoluo de dependncias de outras bibliotecas.Foram explicadas as vrias convenes, visando evitar excessiva configurao:

    Roteamento via localizao de mdulos sob o pacote routes; Recebimento de parmetro por conveno de nomes; Injeo de Dependncias permitindo acesso a objetos do Weapp2; Utilizao de configuraes globais.

    Por fim, foi visto como se utilizar o mdulo tekton.router.py para calcular paths, permitindo aatualizao automtica de endereos no caso de refatorao de nomes de funes.Com base nesse conhecimento sero construdos todos os exemplos constantes no restante desselivro.

  • Tekton 42

    Questes1. Para que serve o Virtualenv?2. Qual a funo do arquivo convention.py?3. Por que necessrio incluir bibliotecas atravs de cdigo no arquivo convention.py?4. Como ficaria a declarao de uma funo para tratar a execuo de chamada no path

    /usuario/salvar?nome=Renzo&idade=31?5. Como se diferenciam parmetros recebidos por injeo de dependncia dos recebidos via

    requisio HTTP?6. Qual deve ser a posio de parmetros recebidos via injeo de dependncia?7. Qual deve ser o parmetro declarado quando for necessrio fazer um redirecionamento?8. Qual o script e funo devem ser utilizados para se calcular paths com base em uma funo?

  • Tekton 43

    Respostas1. O Virtualenv serve para se criar ambientes Python isolados para cada projeto.2. O arquivo convention.py serve para fazer a ligao entre o Tekton e o Wepapp2. Ele

    o arquivo onde se encontra o handler que delega todas requisies para funes que seencontram sob o pacote routes, atravs de conveno.

    3. necessrio incluir bibliotecas atravs de cdigo no arquivo convention.py porque diferentede servidores tradicionais, na plataforma GAE no se tem acesso ao Sistema Operacional parase poder instalar as bibliotecas utilizando virtualenv e pip.

    4. A declarao da funo seria def salvar(nome,idade) e deveria constar no script usuario.py.5. Parmetros recebidos via injeo de dependncia possuem a conveno de conter o prefixo _

    antes de seus nomes. Parmetros recebidos via requisio HTTP so escritos sem esse prefixo.6. Parmetros recebidos via injeo de dependncia devem sempre ser os primeiros a serem

    declarados em uma funo.7. Quando for necessrio fazer um redirecionamento deve ser declarada a dependncia _handler

    para acessar a instncia de RequestHandler que est tratando a requisio. Deve ser utilizadoo mtodo redirect desse objeto para se efetuar o redirecionamento.

    8. Deve ser utilizada a funo to_path do mdulo tekton.router para se calcular o pathrespectivo a uma funo, que deve ser passada como parmetro.

    ndice analticoPrefcioRelao de ConfianaPor que Google App Engine (GAE)?Por que Python?PblicoConhecimento PrvioCdigo Fonte e Vdeo AulasOrganizao do Contedo

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

    Webapp2IntroduoO que Webapp2?Arquivo app.yamlRoteamento via Webapp2RequestResponseRedirectResumoQuestesRespostas

    TektonIntroduoSetup inicialVirtualenvScript convention.pyRoteamento via TektonRecebimento de ParmetrosConfiguraes Globais e InternacionalizaoInjeo de DependnciaRedirecionamentoResumoQuestesRespostas