Slide 1

Slide 1 text

Oficina Python e Google App Engine Rodrigo Amaral Google Developer Group Aracaju Fevereiro de 2014

Slide 2

Slide 2 text

Olá! rodrigoamaral rodrigoamaral.net

Slide 3

Slide 3 text

http://pug-se.github.io

Slide 4

Slide 4 text

Aplicações web são legais ■ Multiplataforma ■ Acessadas de qualquer lugar ■ Fácil distribuição ■ Atualização instantânea ■ Correção de bugs controlada

Slide 5

Slide 5 text

Mas as coisas podem ficar complicadas ■ Múltiplos acessos simultâneos ■ Administração de servidores ■ Precisa de alta disponibilidade ■ Custos de hospedagem ■ Programação precisa ser ágil

Slide 6

Slide 6 text

Platform as a Service (PaaS) ■ Delegar tarefas de administração ■ Permitir escalabilidade ■ Reduzir os custos iniciais ■ Prover serviços auxiliares

Slide 7

Slide 7 text

Google App Engine Executar aplicações web na infraestrutura do Google

Slide 8

Slide 8 text

Google App Engine Características da plataforma

Slide 9

Slide 9 text

Sandbox ■ Ambiente protegido ■ Facilita distribuição da demanda ■ Não escreve no sistema de arquivos ■ Somente HTTP(S) nas portas padrão ■ Não dispara subprocessos ■ Não enxerga outras aplicações

Slide 10

Slide 10 text

Armazenamento de dados ■ Datastore ● banco de dados não-relacional ● entidades, tipos, propriedades ● schemaless ■ Google Cloud SQL ● banco de dados relacional ■ Google Cloud Storage

Slide 11

Slide 11 text

Autenticação e autorização ■ Google Accounts ■ Users API

Slide 12

Slide 12 text

Serviços ■ URL Fetch ■ Mail ■ XMPP ■ Memcache ■ Manipulação de imagens ■ Fila de tarefas

Slide 13

Slide 13 text

Python Visão geral da linguagem

Slide 14

Slide 14 text

Python ■ Tipagem dinâmica ■ Uso geral ■ Multiparadigma ■ Sintaxe clara e legível ■ Introspecção poderosa ■ Rica biblioteca padrão

Slide 15

Slide 15 text

Quem usa Python?

Slide 16

Slide 16 text

Python cabe no seu cérebro class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } } print "Hello, World!" JAVA PYTHON

Slide 17

Slide 17 text

Python cabe no seu cérebro (2) vetor = [1, 2, 3, 4, 5, 6, 7] quadrado_pares = [n ** 2 for n in vetor if n % 2 == 0] print(quadrado_pares) # mostra [4, 16, 36] QUADRADO DOS NÚMEROS PARES EM UM VETOR

Slide 18

Slide 18 text

Python cabe no seu cérebro (3) import random sorteio = 'Pedro Maria Paulo Joana Renato Sofia'.split() print random.choice(sorteio) SORTEIO SIMPLES

Slide 19

Slide 19 text

Módulos ⬝ Facilita a organização dos programas ⬝ Todo arquivo .py é um módulo ⬝ Um módulo faz referência a outro com o comando import

Slide 20

Slide 20 text

Importando módulos >>> import sys >>> print(sys.version) 2.7.4 (default, Sep 26 2013, 03:20:56) [GCC 4.7.3] >>> from math import pi >>> pi 3.141592653589793

Slide 21

Slide 21 text

Listas [ ] >>> capitais = ["Aracaju", "Recife", "Natal"] >>> capitais ['Aracaju', 'Recife', 'Natal'] >>> len(capitais) 3 >>> capitais[1] 'Recife' >>> capitais.append("Salvador") >>> capitais ['Aracaju', 'Recife', 'Natal', 'Salvador'] >>> capitais.insert(2, "Fortaleza") >>> capitais ['Aracaju', 'Recife', 'Fortaleza', 'Natal', 'Salvador']

Slide 22

Slide 22 text

Listas (cont.) >>> c = capitais.pop() >>> c 'Salvador' >>> capitais ['Aracaju', 'Recife', 'Fortaleza', 'Natal'] >>> capitais[-1] 'Natal' >>> capitais[1:3] ['Recife', 'Fortaleza'] >>> capitais[:2] ['Aracaju', 'Recife'] >>> capitais[2:] ['Fortaleza', 'Natal'] >>> capitais.sort() >>> capitais ['Aracaju', 'Fortaleza', 'Natal', 'Recife']

Slide 23

Slide 23 text

Iterando >>> for capital in capitais: ... print(capital) ... Aracaju Fortaleza Natal Recife

Slide 24

Slide 24 text

Dicionários { } ⬝ Parecidos com listas ⬝ Conjunto de chaves e valores ⬝ Cada elemento é uma tupla de chave e valor ⬝ Estrutura conhecida como mapping, hash, array associativo etc.

Slide 25

Slide 25 text

Acessando valores >>> agenda = {"Pedro": "2626-2626", "Maria": "2323-2323", "Paulo": "2121-2121"} >>> telefone = agenda["Maria"] >>> telefone '2323-2323'

Slide 26

Slide 26 text

Classes ⬝ Definidas com a palavra-chave class ⬝ class Pessoa: ⬝ O primeiro argumento de todo método é self ⬝ def meu_metodo(self, x): ⬝ Atributos são referenciados com self ⬝ self.atributo = 42

Slide 27

Slide 27 text

Chega de papo! Vamos construir juntos uma pequena aplicação web com Python e App Engine

Slide 28

Slide 28 text

Download http://developers.google.com/appengine/downloads #Google_App_Engine_SDK_for_Python

Slide 29

Slide 29 text

Python App Engine SDK ■ Servidor de aplicação que simula o ambiente App Engine ● dev_appserver.py ■ Utilitário para upload ● appcfg.py ■ Interface gráfica (Windows e Mac) ■ Python 2.7

Slide 30

Slide 30 text

Instalação Linux: descompactar e configurar $PATH Windows e Mac: executar instalador

Slide 31

Slide 31 text

app.yaml Entre outras configurações, descreve o que a aplicação deve fazer quando uma URL é acessada

Slide 32

Slide 32 text

Web Server Gateway Interface (WSGI) ■ Especifica a comunicação entre servidores web e aplicações ■ Se o framework é compatível, funciona com o App Engine ■ Django, Flask, Pyramid, Bottle etc. ■ webapp2

Slide 33

Slide 33 text

main.py Módulo principal da nossa aplicação de exemplo. É nele que vamos implementar as classes que tratam nossas requisições.

Slide 34

Slide 34 text

Estrutura da aplicação Datastore Templates Cliente app.yaml Identificação Versão Resolução de URLs Permissões script.py Aplicação WSGI Módulos da aplicação Frameworks e bibliotecas APIs de serviços requisição resposta

Slide 35

Slide 35 text

webapp2 WSGIApplication Responsável por rotear as requisições para as classes que vão tratá-las, de acordo com a URL Request Handlers Classes que processam as requisições e constroem as respostas

Slide 36

Slide 36 text

webapp2.RequestHandler request - get() response - headers - write() redirect()

Slide 37

Slide 37 text

Integrando com Google Accounts Users API from google.appengine.api import users users.get_current_user() users.create_login_url() users.create_logout_url()

Slide 38

Slide 38 text

Manipulando dados de forms ⬝ Implementar método post() ⬝ Obter dados do request ⬝ self.request.get()

Slide 39

Slide 39 text

Armazenando dados ⬝ Datastore (NDB) ⬝ google.appengine.ext.ndb ⬝ Entidades ⬝ ndb.Model ⬝ Properties ⬝ ndb.StringProperty, ndb.IntegerProperty etc...

Slide 40

Slide 40 text

Templates ⬝ Framework Jinja2 ⬝ Arquivos .html JINJA_ENVIRONMENT = jinja2.Environment( loader=jinja2.FileSystemLoader(os.path.dirname (__file__)), extensions=['jinja2.ext.autoescape'], autoescape=True )

Slide 41

Slide 41 text

Arquivos estáticos ⬝ Declarar no app.yaml handlers - url: /css static_dir: css ⬝ Handlers são resolvidos na ordem ⬝ URLs com .* devem ficar por último

Slide 42

Slide 42 text

Deploy da aplicação ⬝ Registrar aplicação no GAE ⬝ Ajustar configuração no app.yaml ⬝ Upload ⬝ appcfg.py update

Slide 43

Slide 43 text

Obrigado!