Anda di halaman 1dari 52

App Engine e Python

Voc programa e o Google escala!


Renzo Nuccitelli
Esse 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 Publishing
process. Lean Publishing is the act of publishing an in-progress ebook using lightweight tools and
many iterations to get reader feedback, pivot until you have the right book and build traction once
you do.
2014 - 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 a
hashtag no Twitter:
https://twitter.com/search?q=#appengineescala

Dedico esse livro minha me Amanda e minha noiva Priscila, que sempre me apoiam, por mais
malucas que sejam minhas idias.
Ao meu grande amigo Reginaldo Filho, vulgo Beraba, que me apresentou 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 . . . . . . . . . . . . . . . . .
Relao de Confiana . . . . . . . .
Por que Google App Engine (GAE)?
Por que Python? . . . . . . . . . . .
Pblico . . . . . . . . . . . . . . . .
Conhecimento Prvio . . . . . . . .
Cdigo Fonte e Vdeo Aulas . . . .
Organizao do Contedo . . . . .

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

i
i
i
ii
ii
ii
iii
iii

Ambiente de Desenvolvimento
Introduo . . . . . . . . . . .
Interpretador Python . . . . .
Terminal de Comando . . . .
Pycharm . . . . . . . . . . . .
Publicao (Deploy) . . . . . .
Windows e Mac . . . . . . . .
Resumo . . . . . . . . . . . .
Questes . . . . . . . . . . . .
Respostas . . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

1
1
1
2
4
5
8
10
11
12

Webapp2 . . . . . . . . . .
Introduo . . . . . . . .
O que Webapp2? . . . .
Arquivo app.yaml . . . .
Roteamento via Webapp2
Request . . . . . . . . .
Response . . . . . . . . .
Redirect . . . . . . . . .
Resumo . . . . . . . . .
Questes . . . . . . . . .
Respostas . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

13
13
13
14
17
19
20
20
22
23
24

Tekton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

25
25

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

CONTEDO

Setup inicial . . . . . . . . . . . . . . . . . .
Virtualenv . . . . . . . . . . . . . . . . . . .
Script convention.py . . . . . . . . . . . . .
Roteamento via Tekton . . . . . . . . . . . .
Recebimento de Parmetros . . . . . . . . .
Configuraes Globais e Internacionalizao
Injeo de Dependncia . . . . . . . . . . . .
Redirecionamento . . . . . . . . . . . . . . .
Resumo . . . . . . . . . . . . . . . . . . . .
Questes . . . . . . . . . . . . . . . . . . . .
Respostas . . . . . . . . . . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

25
26
32
34
36
36
38
39
41
42
43

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

Relao de Confiana
Durante minha vida passei por algumas situaes e precisei de ajuda. E por isso fui salvo pela
educao. Se voc no pode pagar, envie um email para renzo.n@gmail.com para poder adquirir o
livro gratuitamente de forma legal.
Em contrapartida peo o seguinte, na base da confiana:
1.
2.
3.
4.

Curta a fan page;


Divulgue o livro entre seus amigos;
Envie sua opinio aps a leitura, permitindo sua divulgao;
Compre uma cpia quando estiver em condies.

Por que Google App Engine (GAE)?


No incio de 2010 topei o desafio de desenvolver um site destinado ao trfego de fotos. Eu j
desenvolvia software, mas no tinha conhecimento profundo sobre todo o processo. Em particular,
no conhecia nada sobre servidores e linux.
Ento comecei a procurar um host. Montei meu ambiente de desenvolvimento. Contudo, achava que
a estrutura escolhida no suportaria o volume esperado de fotos. Era poca da exploso dos sites de
compras coletivas e meus clientes pretendiam fazer promoes 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.html
https://www.facebook.com/pythonappengine
http://www.picpro.com.br

Prefcio

ii

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

Por que Python?


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

Pblico
Este livro foi escrito para quem deseja aprender a fazer uma aplicao completa para internet. Mais
do que isso, ele ideal para quem quer transformar uma 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 apresenta
ferramentas superficialmente. Sendo assim, esse livro uma excelente fonte para voc ir alm do
bsico, desenvolvendo solues profissionais e robustas.

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

Prefcio

iii

Cdigo Fonte e Vdeo Aulas


Todo 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 Contedo
O contedo est organizado nos seguintes captulos:
1.
2.
3.
4.
5.
6.
7.
8.
9.

Ambiente de Desenvolvimento: como montar o ambiente local de desenvolvimento;


Webapp2: apresentao do framework web Webapp2;
Tekton: apresentao do framework web Tekton;
Frontend: linguagem de template e arquivos estticos;
Usurios e Segurana: Login de usurios, segurana e controle de permisses;
Banco de Dados: persistncia de dados utilizando o Big Table;
Arquitetura de Apps: arquitetura para camada de negcios com GaeBusiness;
AJAX com AngularJS: chamadas AJAX com uso do framework AngularJS;
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 Desenvolvimento
Se quiser derrubar uma rvore em metade do tempo, passe o dobro do tempo amolando o machado.
- Provrbio chins de autor desconhecido

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

Interpretador Python
Atualmente 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. O
App 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 digite
python. A verso disponvel impressa como primeira linha aps a execuo, conforme exemplo a
seguir:

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

Ambiente de Desenvolvimento

Execuo do Python via linha de comando no Ubuntu 12.04

Python 2.7.3 (default, Sep 26 2013, 20:03:06)


[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>

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

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

export GAE_SDK="seu diretorio"/google_appengine


PATH=$PATH:$GAE_SDK

A seguir se encontra um exemplo para um SDK que foi instalado em diretrio bin localizado na
pasta 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_completion
fi
export GAE_SDK=/home/renzo/bin/google_appengine
PATH=$PATH:$GAE_SDK

Cabe ressaltar que a varivel GAE_SDK no obrigatria. Contudo, ela ser utilizada no captulo de
Testes Automatizados. E por ser parte da configurao, ela j foi aqui inserida.
https://developers.google.com/appengine/downloads?hl=pt-br

Ambiente de Desenvolvimento

Ol Mundo - Terminal
Dentro 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 figura
1.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 comando
dev_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 o
SDK est servindo a aplicao localmente. Acesse o endereo http://localhost:8080 em seu navegador
e confira se aparece a mensagem Hello World. Em caso negativo, confira os passos anteriores.
Desligue o servidor utilizando o atalho Ctrl+C.

Ambiente de Desenvolvimento

Figura 1.02: Comando dev_appserver.py

Observe que a primeira opo depois do comando o diretrio onde se encontra o arquivo de
configurao app.yaml. Sendo assim, tambm funcionaria o comando dev_appserver.py new_project_template se executado direto do diretrio home.

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

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

Cumpridas essas etapas, navegue at o diretrio bin da pasta de instalao do Pycharm no


terminal e rode o script pycharm.sh. Exemplo de execuo do comando $ ./bin/pycharm3.0.1/bin/pycharm.sh . Com o ambiente inicializado voc pode fixar seu cone na barra de tarefas
para poder inicializar a aplicao apenas com um clique.
Prefira baixar a verso profissional do Pycharm, pois a verso gratuita no possui alguns
plugins, 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

Ol Mundo - IDE
Ao iniciar a IDE, clique em Create New Project e escolha o tipo de projeto Google App Engine project.
Voc deve assinalar um identificador para o seu projeto e informar o diretrio onde se encontra o
SDK do Google App Engine. A tela de criao de projeto deve ficar semelhante figura 1.03:

Figura 1.03: Novo projeto GAE - Pycharm

Para executar o servidor local, basta clicar no cone verde play que se encontra em destaque na
figura 1.4.
Verique se no link http://localhost:8080 , utilizando seu navegador, aparece a mensagem Hello
World. 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 aprenderem
como inicializar o servidor localmente. Contudo, o processo de publicao do site um passo
fundamental. Somente dessa maneira os usurios podem acess-lo pela rede.
O deploy deve ser simples. Em um bom processo de desenvolvimento, deve ser possvel publicar
apenas com um clique ou comando. Mais do que isso, o site deve ser publicado de maneira

Ambiente de Desenvolvimento

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

Painel de Controle
Para publicao, necessrio a criao de uma aplicao no Painel de Controle do Google App
Engine. Isso deve ser feito no endereo http://appengine.google.com. Ser necessrio utilizar uma
Conta Google. Aps o cadastro, ser possvel visualizar o painel.
Clicando Create Application uma nova aplicao gerada. Um identificador nico e um nome
devem 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 projeto
deve ser editado. O identificador deve ser copiado na primeira linha, no item application. Um
exemplo 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

Para usar o App Engine a conta Google 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, pode ser utilizado um celular de outra operadora. Outra opo pedir para
algum j cadastrado enviar um convite, via painel de administrao, para administrao
de um projeto j existente. Nesse caso, a verificao no necessria.

Deploy - Terminal de Comando


Editado o arquivo app.yaml, deve ser acessado o diretrio do projeto no terminal e digitado o
comando 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 utilizou
para criar a aplicao no painel de controle. Com esse comando o SDK ir escanear os arquivos do
projeto e envi-los ao servidor.
Finalizada a publicao, possvel acessar o site atravs do endereo http://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 o
cdigo de segurana.
http://www.google.com/intl/pt-PT/landing/2step/

Ambiente de Desenvolvimento

Deploy via Pycharm


Para fazer o deploy com o Pycharm, o menu Tools > Google App Engine > Deploy Application deve
ser acessado, conforme figura 1.07:

Figura 1.07: Deploy via Pycharm

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

Windows e Mac
o SDK oferece uma Interface Visual (GUI, do ingls Graphical User Interface) que pode ser utilizada
em opo linha de comando para os Sistemas Operacionais Windows Mac OS. Clicando em em
File > Add new Application um novo projeto criado, como na figura 1.08:
http://www.google.com/intl/pt-PT/landing/2step/

Ambiente de Desenvolvimento

Figura 1.08: GUI do App Engine

Criado o projeto possvel iniciar o servidor local clicando no boto Run e fazer o deploy clicando
no boto com esse nome. importante notar que a utilizao da IDE Pycharm faz com que o
desenvolvimento ocorra da mesma forma nos diferentes sistemas operacionais. Por isso ele ser
utilizado como base para os exemplos.
Outra fator interessante que ao instalar no Mac, ele informa que criar um link simblico para
a pasta do SDK. Esse link se encontra em /usr/local/google_appengine e deve ser utilizado quando
necessrio para referenciar as bibliotecas da plataforma.

Ambiente de Desenvolvimento

10

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

Ambiente de Desenvolvimento

Questes
1.
2.
3.
4.
5.
6.
7.

Quais as duas principais verses atuais do interpretador Python?


Qual verso de Python suportada atualmente pelo App Engine?
Para que serve o SDK do App Engine?
Qual a vantagem de colocar ferramentas instaladas no path do Sistema Operacional?
O que e para que serve uma IDE?
Como se chama o arquivo de configurao de uma aplicao App Engine?
Qual o domnio padro para acessar aplicaes App Engine na internet?

11

Ambiente de Desenvolvimento

12

Respostas
1. 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 independente
de sistema operacional.
6. O arquivo de configurao de uma aplicao App Engine se chama app.yaml
7. O domnio padro para acessar aplicaes App Engine na internet appspot.com

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

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

O que Webapp2?
Webapp2 uma biblioteca de cdigo aberto utilizada na documentao oficial introdutria ao GAE.
Ela implementa o padro WSGI (Web Server Gateway Interface) e pode ser utilizada em outras
plataformas que forneam 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.yaml
No projeto criado no captulo anterior existe um arquivo de configurao chamado app.yaml
conforme listagem 2.01:
Listagem 2.01: Arquivo app.yaml

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

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

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

1
2
3
4
5

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

15

Webapp2

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

Figura 2.01: Mltiplas Verses

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

Bibliotecas Embutidas
O GAE fornece um conjunto de bibliotecas embutidas. Para instalao, deve ser editada a seo
libraries do arquivo de configurao, conforme listagem 2.03.

16

Webapp2

Cada item define o nome da biblioteca a ser instalada e, opcionalmente, sua respectiva verso. No
exemplo foi instalada a verso 2.5.2 da biblioteca Webapp2.
Listagem 2.03: Instalao do framework Webapp2

1
2
3

libraries:
- name: webapp2
version: "2.5.2"

Roteamento via Arquivo de Configurao


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

1
2
3
4
5
6
7

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

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

Figura 2.02: favicon.ico

Webapp2

17

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

Roteamento via Webapp2


Uma vez que o arquivo de configurao aponta para um script, importante entender seu contedo,
que se apresenta na listagem 2.05 a seguir:
Listagem 2.05: Script main.py

1
2
3
4
5
6
7
8
9
10
11
12

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


import webapp2

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

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


debug=True)

Na linha 3 importado o mdulo webapp2 pertencente ao framework de mesmo nome. Como se


quer construir um handler para tratar requisies, construda a classe HomeHandler herdando de
RequestHandler na linha 6. Nessa classe foi sobrescrito o mtodo referente ao respectivo verbo
HTTP. No caso do cdigo, sobrescreveu-se o mtodo get na linha 7, referente ao verbo HTTP GET.
Por fim, muito comum em Python termos vrias classes declaradas em um mdulo. Sendo
assim, apenas acrescentar o script no arquivo de configurao no suficiente para se saber qual
handler deve ser executado. Por essa razo necessrio fazer tambm o roteamento dentro do
cdigo, como consta na linha 12. Nela criado o parmetro app construindo-se um objeto do tipo
WSGIApplication.

18

Webapp2

O primeiro parmetro da construo uma lista de tuplas, onde o primeiro argumento a expresso
regular mapeando os paths. No exemplo, est sendo mapeada a raiz do projeto '/'. J o segundo
parmetro indica a classe, HomeHandler, que ir ser utilizada para tratar a requisio.
Com esse cdigo escrito e depois de executar o servidor, possvel obter a mensagem Ol Mundo
no navegador, conforme a figura 1.03:

Figura 2.03: Mensagem Ol Mundo! no navegador

Seguindo a mesma filosofia, o script main.py pode ser editado para responder Ol Wepapp2!
quando se acessa o path /outra. As mudanas se encontram no Cdigo 2.01:
Cdigo 2.01: Script main.py

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

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

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

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


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

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

Figura 2.04: Mensagem Ol Webpp2! no navegador

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

19

Webapp2

1. Configurar o arquivo app.yaml toda vez que se deseja criar um script Python;
2. Configurar cada Handler dentro de seu respectivo script com o Webapp2.

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

Figura 2.05: Url com query string no navegador

importante notar que acessando a url, a mensagem apresentada no mais esttica. Ela
construda com base nos parmetros enviados. Para isso se utiliza o mtodo get do objeto Request,
fornecendo o nome do parmetro do qual se deseja extrair o valor. Os valores obtidos das requisies
sempre so do tipo string. 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
2
3
4
5

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

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

Webapp2

20

Response
Aps o recebimento de uma requisio, o servidor deve enviar uma resposta utilizando protocolo
HTTP. Para cumprir esse objetivo, utilizado o objeto do tipo Response. Ele prov mtodos para
auxiliar no envio de dados.
Nos exemplos anteriores seu mtodo write foi utilizado para enviar uma string como resposta s
requisies. 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
2
3
4
5

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

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

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

1
2
3
4
5
6
7
8
9
10

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

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

21

Webapp2

11
12
13
14
15
16

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


('/outra', OutroHandler),
('/redirecionar', RedirecionaParaOutroHandler),
('/google', GoogleHandler),
('/parametros', ParametrosHandler)],
debug=True)

Dessa maneira, ao acessar http://localhost:8080/redirecionar, o usurio ser redirecionado


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

Webapp2

22

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

Webapp2

23

Questes
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.

Qual o nome do arquivo de configurao do Google App Engine?


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

Webapp2

24

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

Tekton
Voc deve renunciar toda superficialidade, toda conveno, toda presuno e desiluso.
- Gustav Mahler

Introduo
Conveno em vez de Configurao (Convention over Configuration) o grande mantra desse
captulo. Ser explicado o funcionamento do framework Tekton e todas suas convenes. A ideia
principal evitar a excessiva configurao do sistema, permitindo o foco em funcionalidades.
Diferente da abordagem do captulo anterior, Webapp2, o roteamento e recebimento de parmetros
ser 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 do
livro.

Setup inicial
O repositrio do Tekton consiste em um template para iniciar um novo projeto. possvel copiar esse
cdigo 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/tekton
https://github.com/renzon/tekton/archive/master.zip

26

Tekton

1.
2.
3.
4.
5.
6.

backend: diretrio raiz de todo cdigo do servidor;


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

Os detalhes sobre essas estruturas sero apresentados nas prximas sees.

Virtualenv
Virtualenv 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 sero
utilizadas.
Instrues de instalao para os sistemas Linux, Mac OS e Windows.

Virtualenv Linux e Mac OS


A instalao do virtualenv no Linux pode ser feita atravs do comando sudo apt-get install
python-virtualenv, sendo necessria a senha de root para instalao.
J no Mac OS necessrio instalar a biblioteca utilizando o instalador de pacotes Python (pip). Para
isso, 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 ser
utilizado para instalar o virtualenv.
Depois de instalado o virtualenv, o script de setup do projeto o mesmo para Linux e Mac. A
pasta venv do projeto contm o script venv.sh. Ele cria o ambiente isolado e instala as bibliotecas
necessrias. 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 Windows
Para instalar o virtualenv no Windows se faz necessrio a instalao do pip, uma biblioteca python
para instalao de pacotes. Para isso deve ser baixado o script Python get_pip.py. Depois o script
deve ser executado com o interpretador Python, conforme exemplo a seguir:
https://raw.github.com/pypa/pip/master/contrib/get-pip.py

27

Tekton

Execuo do script get_pip.sh

C:\Users\renzovm>cd Desktop
C:\Users\renzovm\Desktop>python get_pip.py
Downloading/unpacking pip
Downloading/unpacking setuptools
Installing collected packages: pip, setuptools
Successfully installed pip setuptools
Cleaning up...

Aps a instalao o pip deve ser adicionado ao path. Para isso deve ser aberto o explorer e utilizado o
boto 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 deve
ser 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 do
Python ao path, evitando todo o trabalho manual.

Com o pip instalado deve ser executado o comando pip install virtualenv para instalar o
virtualenv. 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. Para
rodar 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 renzovm
C:\Users\renzovm>cd Desktop
C:\Users\renzovm\Desktop>cd appengineepython
C:\Users\renzovm\Desktop\appengineepython>cd backend
C:\Users\renzovm\Desktop\appengineepython\backend>cd venv
C:\Users\renzovm\Desktop\appengineepython\backend\venv>venv.bat

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

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

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

J o arquivo dev_requirements contm dependncias necessrias apenas durante processo de


desenvolvimento. Esse o caso das bibliotecas Mock e Moomygae, utilizadas para facilitar a criao
de testes automticos:

29

Tekton

Arquivo dev_requirements.txt

-r requirements.txt
mock==1.0.1
mommygae==1.1

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

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

Virtualenv e Pycharm
As aes realizadas at agora serviram apenas para instalar as bibliotecas no projeto. Contudo, o
Pycharm precisa utilizar o ambiente criado para poder auxiliar no desenvolvimento, oferecendo
opes 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 de
pesquisa deve ser inserida a palavra Interpreter e escolhida a opo Python Interpreters. Deve ser
pressionado o cone + e escolhida a opo Local..., conforme figura 3.02:

Figura 3.02: Virtualenv e Pycharm

30

Tekton

Feito isso, deve ser selecionado o ambiente isolado localizado dentro do projeto. No Linux o arquivo
a 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 menu
Edit 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 Working
directory, 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 projeto
no navegador, conforme figura 3.05:

31

Tekton

Figura 3.05: Hello World Tekton

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

32

Tekton

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 ganhos
de produtividade, o tempo gasto na configurao ser recuperado rapidamente durante a fase
desenvolvimento.

Script convention.py
No 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.app
secure: always
- url: /robots\.txt
static_files: static/robots.txt
upload: static/robots.txt
- url: /favicon\.ico
static_files: static/img/favicon.ico
upload: static/img/favicon.ico
- url: /static(.*)
static_files: static\1
upload: static.*
- url: /[^_].*
*script*: convention.app
secure: 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, ao
path. 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. Mais
detalhes sobre isso ser visto na seo Arquivo settings.py.
Nas demais linhas definido um nico RequestHandler que trata todas requisies. importante
ressaltar que tanto chamadas POST e GET so tratadas pelo mesmo mtodo make_convention. Se
for necessrio atender outros mtodos, como o PUT, suficiente editar o arquivo copiando o mtodo
get e substituindo seu nome para tambm atender a respectiva chamada HTTP.

Tekton

34

Cdigo 3.01: Script convention.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

# Put lib on path, once Google App Engine does not allow doing it directly
sys.path.append(os.path.join(os.path.dirname(__file__), "lib"))
sys.path.append(os.path.join(os.path.dirname(__file__), "apps"))
import settings
from tekton.gae import middleware
import webapp2
from webapp2_extras import i18n
i18n.default_config['default_locale'] = settings.DEFAULT_LOCALE
i18n.default_config['default_timezone'] = settings.DEFAULT_TIMEZONE

class BaseHandler(webapp2.RequestHandler):
def get(self):
self.make_convention()
def post(self):
self.make_convention()
def make_convention(self):
middleware.execute(settings.MIDDLEWARE_LIST, self)

app = webapp2.WSGIApplication([("/.*", BaseHandler)], debug=False)

A ideia geral a delegao do processamento de todas requisies pelo script convention.py, no


mais sendo necessrio mapear handlers manualmente. A maneira de se fazer isso ser explicada na
prxima seo.

Roteamento via Tekton


O 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, e
executar sua funo de nome index. O cdigo 3.02 apresenta o cdigo do arquivo:

Tekton

35

Cdigo 3.02: home.py

1
2
3
4

@login_not_required
@no_csrf
def index():
return TemplateResponse()

O resultado da execuo do cdigo foi visto no final da seo de Setup, na figura 3.05, onde aparecia
a home do Tekton.
No caso do acesso ao path /usuario, a biblioteca ir procurar pelo script usuario.py e executar
sua funo index. J o acesso a /usuario/ola acarretar na execuo da funo ola do script
usuario.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
2
3
4
5
6
7
8
9
10

@login_not_required
@no_csrf
def index(_resp):
_resp.write('Pgina de Usurio')

@login_not_required
@no_csrf
def ola(_resp):
_resp.write('Ol Usurio')

Ao acessar o link http://localhost:8080/usuario possvel visualizar a mensagem Pgina de


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

36

Tekton

Recebimento de Parmetros
Alm da conveno de rotas, o recebimento de parmetros tambm feito por conveno. Para
receber o valor de um parmetro chamado nome necessrio apenas declarar um argumento de
mesmo nome. Como exemplo, a funo ola foi alterada conforme cdigo 3.04:
Cdigo 3.04: funo ola com parmetro nome

1
2

def ola(_resp, nome):


_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 sobrenome

1
2

def ola(_resp, nome, sobrenome):


_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 mesma
mensagem 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=Nuccitelli

A mensagem seria exatamente a mesma vista anteriormente.

Configuraes Globais e Internacionalizao


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

Tekton

37

Arquvio setting.py

1
2
3
4
5
6
7

APP_URL = 'https://tekton-fullstack.appspot.com'
SENDER_EMAIL = 'renzon@gmail.com'
DEFAULT_LOCALE = 'pt_BR'
DEFAULT_TIMEZONE = 'America/Sao_Paulo'
LOCALES = ['en_US', 'pt_BR']
TEMPLATE_404_ERROR = 'base/404.html'
TEMPLATE_400_ERROR = 'base/400.html'

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

38

Tekton

Figura 3.08: Home em portugus brasileiro

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

39

Tekton

Cdigo 3.09: funo ola com parmetros nome e sobrenome

1
2

def ola(_resp, nome, sobrenome):


_resp.write("Ol %s %s" % (nome, sobrenome))

Se fosse necessrio receber tambm o objeto Request como dependncia, seria suficiente acrescentar
um segundo parmetro funo, conforme cdigo cdigo 3.10:
Cdigo 3.10: funo ola com injeo de objetos Response e Request

1
2
3
4

def ola(_resp, _req, nome, sobrenome):


_resp.write("Ol %s %s" % (nome, sobrenome))
# Imprimindo parametros de requisio http
_resp.write("Parametros: %s" % _req.arguments())

O underscore _ na frente dos parmetros injetados apenas uma conveno. Ela foi
adotada para diferenciar os argumentos que so injetados daqueles que so extrados da
requisio HTTP. Dessa maneira possvel perceber no cdigo 3.10 que _resp e _req so
dependncias injetadas, enquanto nome e sobrenome so parmetros recebidos via protocolo
HTTP.

Os parmetros injetados devem sempre ser os primeiros argumentos da funo. Sendo


assim, 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 pode
ser empregada para outros objetos ou funes. A vantagem dessa tcnica tornar o cdigo testvel.
Isso ficar mais claro no captulo de Testes Automatizados.

Redirecionamento
Uma vez que o objeto RequestHandler recebido como injeo de dependncia, para fazer um
redirecionamento necessrio apenas receb-lo atravs do parmetro _handler e utilizar seu mtodo
redirect. 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
2
3
4
5

@login_not_required
@no_csrf
def redirecionar(_handler):
url = r'/usuario/ola/Renzo/Nuccitelli'
_handler.redirect(url)

O problema dessa abordagem que o path inserido como uma string. Se por alguma razo o nome
da funo ola for alterado, o redirecionamento levar a um link quebrado. Por essa razo o Tekton
prov 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 de
refatorao da funo ola, o link do redirecionamento iria ser atualizado automaticamente para o
endereo correto.
Cdigo 3.12: Mtodo Redirecionar com url calculada por tekton.router.py

1
2
3
4

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

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

41

Tekton

Resumo
Nesse captulo foi abordado o framework Tekton. Foi utilizado o virtualenv para sua instalao e o
arquivo 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 a
atualizao automtica de endereos no caso de refatorao de nomes de funes.
Com base nesse conhecimento sero construdos todos os exemplos constantes no restante desse
livro.

42

Tekton

Questes
1.
2.
3.
4.
5.
6.
7.
8.

Para que serve o Virtualenv?


Qual a funo do arquivo convention.py?
Por que necessrio incluir bibliotecas atravs de cdigo no arquivo convention.py?
Como ficaria a declarao de uma funo para tratar a execuo de chamada no path
/usuario/salvar?nome=Renzo&idade=31?
Como se diferenciam parmetros recebidos por injeo de dependncia dos recebidos via
requisio HTTP?
Qual deve ser a posio de parmetros recebidos via injeo de dependncia?
Qual deve ser o parmetro declarado quando for necessrio fazer um redirecionamento?
Qual o script e funo devem ser utilizados para se calcular paths com base em uma funo?

Tekton

43

Respostas
1. 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 se
encontram sob o pacote routes, atravs de conveno.
3. necessrio incluir bibliotecas atravs de cdigo no arquivo convention.py porque diferente
de servidores tradicionais, na plataforma GAE no se tem acesso ao Sistema Operacional para
se 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 utilizado
o 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 path
respectivo a uma funo, que deve ser passada como parmetro.