Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Oficina Python e Google App Engine

Oficina Python e Google App Engine

Minicurso que ofertei na SEMINFO 2014 da Universidade Federal de Sergipe, Campus Itabaiana.

Baseada no trabalho de Rodrigo Amaral, apresentado no GDG Aracaju: https://speakerdeck.com/rodrigoamaral/oficina-python-e-google-app-engine

Erick Mendonça

November 12, 2014
Tweet

More Decks by Erick Mendonça

Other Decks in Programming

Transcript

  1. Aplicações web são legais ▪ Multiplataforma ▪ Acessadas de qualquer

    lugar ▪ Fácil distribuição ▪ Atualização instantânea ▪ Correção de bugs controlada
  2. 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
  3. Platform as a Service (PaaS) ▪ Delegar tarefas de administração

    ▪ Permitir escalabilidade ▪ Reduzir os custos iniciais ▪ Prover serviços auxiliares
  4. 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
  5. Armazenamento de dados ▪ Datastore • banco de dados não-relacional

    • entidades, tipos, propriedades • schemaless ▪ Google Cloud SQL • banco de dados relacional ▪ Google Cloud Storage
  6. Serviços ▪ URL Fetch ▪ Mail ▪ XMPP ▪ Memcache

    ▪ Manipulação de imagens ▪ Fila de tarefas
  7. Python ▪ Tipagem dinâmica ▪ Uso geral ▪ Multiparadigma ▪

    Sintaxe clara e legível ▪ Introspecção poderosa ▪ Rica biblioteca padrão
  8. Python cabe no seu cérebro class HelloWorld { public static

    void main(String[] args) { System.out.println("Hello, World!"); } } print "Hello, World!" JAVA PYTHON
  9. 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
  10. Python cabe no seu cérebro (3) import random sorteio =

    'Pedro Maria Paulo Joana Renato Sofia'.split() print random.choice(sorteio) SORTEIO SIMPLES
  11. 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
  12. 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
  13. 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']
  14. 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']
  15. 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.
  16. Acessando valores >>> agenda = {"Pedro": "2626-2626", "Maria": "2323-2323", "Paulo":

    "2121-2121"} >>> telefone = agenda["Maria"] >>> telefone '2323-2323'
  17. 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
  18. 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
  19. 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
  20. main.py Módulo principal da nossa aplicação de exemplo. É nele

    que vamos implementar as classes que tratam nossas requisições.
  21. 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
  22. 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
  23. 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
  24. 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
  25. app.yaml application: helloworld version: 1 runtime: python27 api_version: 1 threadsafe:

    true handlers: - url: /.* script: helloworld.application
  26. 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)
  27. Integrando com Google Accounts Users API from google.appengine.api import users

    users.get_current_user() users.create_login_url(<url_retorno>) users.create_logout_url(<url_retorno>)
  28. 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))
  29. Manipulando dados de forms ⬝ Implementar método post() ⬝ Obter

    dados do request ⬝ self.request.get(<nome>)
  30. Armazenando dados ⬝ Datastore (NDB) ⬝ google.appengine.ext.ndb ⬝ Entidades ⬝

    ndb.Model ⬝ Properties ⬝ ndb.StringProperty, ndb.IntegerProperty etc...
  31. Templates ⬝ Framework Jinja2 ⬝ Arquivos .html JINJA_ENVIRONMENT = jinja2.Environment(

    loader=jinja2.FileSystemLoader(os.path.dirname (__file__)), extensions=['jinja2.ext.autoescape'], autoescape=True )
  32. 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
  33. Deploy da aplicação ⬝ Registrar aplicação no GAE ⬝ Ajustar

    configuração no app.yaml ⬝ Upload ⬝ appcfg.py update <pasta>