Slide 1

Slide 1 text

Oficina Python e Google App Engine Erick Mendonça SEMINFO/UFS Itabaiana 2014 Novembro de 2014

Slide 2

Slide 2 text

Olá! erickmagnus erickmendonca.com.br +ErickMendonça

Slide 3

Slide 3 text

Baseado na apresentação criada por Rodrigo Amaral

Slide 4

Slide 4 text

http://pug-se.github.io

Slide 5

Slide 5 text

http://gdgaracaju.com.br

Slide 6

Slide 6 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 7

Slide 7 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 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

Google App Engine Características da plataforma

Slide 11

Slide 11 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 12

Slide 12 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 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

Python Visão geral da linguagem

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

Quem usa Python?

Slide 18

Slide 18 text

Quem usa Python?

Slide 19

Slide 19 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 20

Slide 20 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 21

Slide 21 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 22

Slide 22 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 23

Slide 23 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 24

Slide 24 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 25

Slide 25 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 26

Slide 26 text

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

Slide 27

Slide 27 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 28

Slide 28 text

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

Slide 29

Slide 29 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 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 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 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 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 36

Slide 36 text

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

Slide 37

Slide 37 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 38

Slide 38 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 39

Slide 39 text

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

Slide 40

Slide 40 text

Agora pare! Pegue no compasso! Ops, Hello World. Crie uma pasta para o projeto: helloworld Crie o arquivo de configuração: app.yaml Crie o arquivo de requisições: helloworld.py

Slide 41

Slide 41 text

Interface gráfica

Slide 42

Slide 42 text

Prompt Crie uma pasta para o projeto: $ mkdir helloworld $ cd helloworld Crie o arquivo de configuração: $ touch app.yaml Crie o arquivo de requisições: $ touch helloworld.py

Slide 43

Slide 43 text

app.yaml application: helloworld version: 1 runtime: python27 api_version: 1 threadsafe: true handlers: - url: /.* script: helloworld.application

Slide 44

Slide 44 text

helloworld.py import webapp2 class MainPage(webapp2.RequestHandler): def get(self): self.response.headers['Content-Type'] = 'text/plain' self.response.write('Hello, World!') application = webapp2.WSGIApplication([ ('/', MainPage), ], debug=True)

Slide 45

Slide 45 text

Servidor de Desenvolvimento $ dev_appserver.py helloworld/

Slide 46

Slide 46 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 47

Slide 47 text

helloworld.py from google.appengine.api import users ... class MainPage(webapp2.RequestHandler): def get(self): user = users.get_current_user() if user: self.response.write('Hello %s!' % user.nickname()) else: self.redirect(users.create_login_url(self.request.uri))

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 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 52

Slide 52 text

Webmarket e Shoutout ⬝ Exemplos usando autenticação, datastore, templates e forms.

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

Bootstrap ⬝ Que tal um exemplo mais elaborado?

Slide 55

Slide 55 text

Obrigado! ⬝ Materiais, slides e mais em: ⬝ http://bit.ly/seminfo-python