Your SlideShare is downloading. ×
Pyramid - O Framework Web para Todos
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Pyramid - O Framework Web para Todos

447

Published on

Apresentação das características e exemplos do framework web Pyramid, realizada na PloneConf 2013 / PythonBrasil [9]

Apresentação das características e exemplos do framework web Pyramid, realizada na PloneConf 2013 / PythonBrasil [9]

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
447
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
13
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Pyramid O framework web para todos Rudá Porto Filgueiras - rudazz@gmail.com Twitter: rudaporto Github: rudaporto 02/10/2013 - PytthonBrasil[9] / PloneConf 2013
  • 2. Tópicos Introdução
  • 3. Tópicos Introdução História
  • 4. Tópicos Introdução História Princípios de Projeto
  • 5. Tópicos Introdução História Princípios de Projeto Exemplos
  • 6. Tópicos Introdução História Princípios de Projeto Exemplos Perguntas
  • 7. Tópicos Introdução História Princípios de Projeto Exemplos Perguntas Obrigado
  • 8. Tópicos Introdução História Princípios de Projeto Exemplos Perguntas Obrigado
  • 9. About Me 1 >>> import this 2 The Zen of Python , by Tim Peters 3 4 Beautiful is better than ugly . 5 Explicit is better than implicit . 6 Simple is better than complex. 7 Complex is better than complicated . 8 ... Usuário de Linux desde 1999 Usuário de Zope desde 2001 Usuário de Plone desde 2005 Não sou desenvolvedor "full time" Membro Fundador da Associação Python Brasil Primeira PythonBrasil == 2 Em busca de oportunidades e desafios!
  • 10. Por que Pyramid? Simplicidade
  • 11. Por que Pyramid? Simplicidade Desempenho
  • 12. Por que Pyramid? Simplicidade Desempenho Ambiente familiar : from Zope/Plone World
  • 13. Por que Pyramid? Simplicidade Desempenho Ambiente familiar : from Zope/Plone World Identificação com o projeto
  • 14. Por que Pyramid? Simplicidade Desempenho Ambiente familiar : from Zope/Plone World Identificação com o projeto Mais detalhes adiante ...
  • 15. Tópicos Introdução História Princípios de Projeto Exemplos Perguntas Obrigado
  • 16. História Projeto repoze.zope2: suporte WSGI Zope2 (reescrita ZPublisher)
  • 17. História Projeto repoze.zope2: suporte WSGI Zope2 (reescrita ZPublisher) Problemas de compatibilidade com Zope2 motivaram a criação de um novo framework
  • 18. História Projeto repoze.zope2: suporte WSGI Zope2 (reescrita ZPublisher) Problemas de compatibilidade com Zope2 motivaram a criação de um novo framework Zope3 foi avaliado, porém percebeu-se que ele levava a mais indireções que o Zope2
  • 19. História Projeto repoze.zope2: suporte WSGI Zope2 (reescrita ZPublisher) Problemas de compatibilidade com Zope2 motivaram a criação de um novo framework Zope3 foi avaliado, porém percebeu-se que ele levava a mais indireções que o Zope2 Pylons e Django não possuíam recursos comuns do Zope: traversal, declarative security e extensibilidade
  • 20. História Projeto repoze.zope2: suporte WSGI Zope2 (reescrita ZPublisher) Problemas de compatibilidade com Zope2 motivaram a criação de um novo framework Zope3 foi avaliado, porém percebeu-se que ele levava a mais indireções que o Zope2 Pylons e Django não possuíam recursos comuns do Zope: traversal, declarative security e extensibilidade Nasceu o repose.bfg que teve sua primeira versão em julho 2008
  • 21. História Projeto repoze.zope2: suporte WSGI Zope2 (reescrita ZPublisher) Problemas de compatibilidade com Zope2 motivaram a criação de um novo framework Zope3 foi avaliado, porém percebeu-se que ele levava a mais indireções que o Zope2 Pylons e Django não possuíam recursos comuns do Zope: traversal, declarative security e extensibilidade Nasceu o repose.bfg que teve sua primeira versão em julho 2008 No final de 2010 o projeto repoze.bfg foi renomeado para Pyramid e se integrou ao Pylons
  • 22. História Projeto repoze.zope2: suporte WSGI Zope2 (reescrita ZPublisher) Problemas de compatibilidade com Zope2 motivaram a criação de um novo framework Zope3 foi avaliado, porém percebeu-se que ele levava a mais indireções que o Zope2 Pylons e Django não possuíam recursos comuns do Zope: traversal, declarative security e extensibilidade Nasceu o repose.bfg que teve sua primeira versão em julho 2008 No final de 2010 o projeto repoze.bfg foi renomeado para Pyramid e se integrou ao Pylons Seu desenvolvimento foi influenciado pelo Zope2, Zope3, Pylons 1.0 e Django
  • 23. Tópicos Introdução História Princípios de Projeto Exemplos Perguntas Obrigado
  • 24. Princípios de Projeto Princípios que nortearam o desenvolvimento do Pyramid: Simplicidade Minimalismo Documentação Desempenho / Velocidade Confiabilidade Aberto (Openess)
  • 25. Simplicidade "Pagar apenas por aquilo que se come"
  • 26. Simplicidade "Pagar apenas por aquilo que se come" Permitir resultados práticos apenas com conhecimento parcial do Pyramid
  • 27. Simplicidade "Pagar apenas por aquilo que se come" Permitir resultados práticos apenas com conhecimento parcial do Pyramid Framework não deve forçar a utilização de uma tecnologia específica
  • 28. Simplicidade "Pagar apenas por aquilo que se come" Permitir resultados práticos apenas com conhecimento parcial do Pyramid Framework não deve forçar a utilização de uma tecnologia específica Manutenção dos conceitos centrais ao mínimo necessário
  • 29. Simplicidade "Pagar apenas por aquilo que se come" Permitir resultados práticos apenas com conhecimento parcial do Pyramid Framework não deve forçar a utilização de uma tecnologia específica Manutenção dos conceitos centrais ao mínimo necessário "Not build by aliens!"
  • 30. Minimalismo O escopo do framewok limita-se ao desenvolvimento de aplicações Web
  • 31. Minimalismo O escopo do framewok limita-se ao desenvolvimento de aplicações Web Mapear as URLs ao código
  • 32. Minimalismo O escopo do framewok limita-se ao desenvolvimento de aplicações Web Mapear as URLs ao código Renderização de templates e views
  • 33. Minimalismo O escopo do framewok limita-se ao desenvolvimento de aplicações Web Mapear as URLs ao código Renderização de templates e views Segurança / Autenticação
  • 34. Minimalismo O escopo do framewok limita-se ao desenvolvimento de aplicações Web Mapear as URLs ao código Renderização de templates e views Segurança / Autenticação Servir artefatos estáticos
  • 35. Minimalismo O escopo do framewok limita-se ao desenvolvimento de aplicações Web Mapear as URLs ao código Renderização de templates e views Segurança / Autenticação Servir artefatos estáticos Obs: não contém ORM específico ou definição de uma tecnologia de banco de dados "padrão"
  • 36. Documentação Ser minimalista implica em maior facilidade para manter a documentação atualizada e completa
  • 37. Documentação Ser minimalista implica em maior facilidade para manter a documentação atualizada e completa O objetivo é que nenhum aspecto do Pyramid fique sem documentação
  • 38. Desempenho / Velocidade Projetado para prover alta velocidade de execução para as tarefas comuns, tais como:
  • 39. Desempenho / Velocidade Projetado para prover alta velocidade de execução para as tarefas comuns, tais como: Renderização de templates e views
  • 40. Desempenho / Velocidade Projetado para prover alta velocidade de execução para as tarefas comuns, tais como: Renderização de templates e views E geração de respostas http para o browser: response objects
  • 41. Confiabilidade / Testes Pyramid é desenvolvido de forma conservadora e testado exaustivamente
  • 42. Confiabilidade / Testes Pyramid é desenvolvido de forma conservadora e testado exaustivamente Por definição: "Se não existe cobertura de testes o código está quebrado"
  • 43. Aberto (Openess) Como Python, o código fonte do Pyramid é distribuído sobre uma licença permissiva
  • 44. Diferenciais Pyramid Gerenciador de transações
  • 45. Diferenciais Pyramid Gerenciador de transações Modelo de Configuração
  • 46. Diferenciais Pyramid Gerenciador de transações Modelo de Configuração Traversal
  • 47. Diferenciais Pyramid Gerenciador de transações Modelo de Configuração Traversal Flexibilidade das Views
  • 48. Diferenciais Pyramid Gerenciador de transações Modelo de Configuração Traversal Flexibilidade das Views Tweens (plugins)
  • 49. Diferenciais Pyramid Gerenciador de transações Modelo de Configuração Traversal Flexibilidade das Views Tweens (plugins) Scaffolds
  • 50. Tópicos Introdução História Princípios de Projeto Exemplos Perguntas Obrigado
  • 51. Hello World! - Aplicação em apenas um arquivo 1 from wsgiref . simple_server import make_server 2 from pyramid. config import Configurator 3 from pyramid. response import Response 4 5 def hello_world( request ) : 6 return Response( ' Hello %(name)s! ' % request . matchdict) 7 8 if __name__ == '__main__ ' : 9 config = Configurator () 10 config . add_route( ' hello ' , ' / hello /{name} ' ) 11 config . add_view( hello_world , route_name=' hello ' ) 12 app = config .make_wsgi_app() 13 server = make_server( '0.0.0.0 ' , 8080, app) 14 server . serve_forever ()
  • 52. Deploy 1 virtualenv −−no−site−packages deploy 2 cd deploy 3 source bin / activate 4 easy_install i n s ta l l pyramid==1.4.5
  • 53. Criando um projeto com Scaffold : template alchemy 1 # criando um novo pacote usando scaffold 2 mkdir src 3 pcreate −s alchemy src / PyBR9Project 1 # visualizando a estrutura do pacote : 2 ls src / PyBR9Project / pybr9project 3 4 __init__ .py 5 models.py 6 scripts 7 static 8 templates 9 tests .py 10 views .py 11 12 # executando testes : 13 python src / PyBR9Project / setup .py test
  • 54. Instalando o pacote e inicializando a aplicação 1 # instalando pacotes para desenvolvimento : 2 cd src / PyBR9Project 3 python setup .py develop 4 5 # i n i t database 6 initialize_PyBR9Project_db development. i n i 7 8 # i n i t web server 9 pserve development. i n i Abrir: http://localhost:6543/
  • 55. Configuração utilizando Decorators Os view decorators no Pyramid são inertes, apenas detectados e ativados explicitamente. No __init__.py da raiz do pacotes: config.scan() 1 from pyramid. view import view_config 2 from pyramid. response import Response 3 4 @view_config(route_name=' turismo ' ) 5 def turismo_view( request ) : 6 return Response( 'Pontos Turisticos ' )
  • 56. Configuração de rotas e API para URL / PATH Definição da rota: 1 # "config" instance of pyramid. config . Configurator 2 config . add_route( ' turismo ' , ' / turismo ' , view=turismo_view) Helpers para geração de URL ou PATH para um determinada rota: 1 url = request . route_url ( ' foo ' , one='1 ' , two='2 ' ) 2 # url : http : / / dominio / prefix /1/2 3 path = request . route_path ( ' foo ' , one='1 ' , two='2 ' ) 4 # path : prefix /1/2 Referência: urldispatch
  • 57. Arquivos estáticos (static files) É possível servir mais de um conjunto de arquivos estáticos: /static e /static2 Caminhos estáticos pode ser serrvidos diretamente de um webserver e o Pyramid gera URLs para esses arquivos Ambiente de desenvolvimento ou produção controlado pelo arquivo .ini 1 # config is an instance of pyramid. config . Configurator 2 config . add_static_view (name=' static ' , path=' / var /www/ static ' ) 3 # another way static directory relative from package root 4 config . add_static_view ( 'static_myapp ' , 'myapp: static ' )
  • 58. Barra de Debug: recursos Scaffolds em geral habilitam debug toolbar em development.ini: rotas configuradas e ultimas renderizações executadas visualizar o conjunto atual de pacotes instalados acompanhar as consultas executadas no sqlalchemy visualizar os logs e várias outras informações da requisição add-on pyramid_debugtoolbar_mongo para visualizar informações do MongoDB
  • 59. Barra de Debug: notfound, authorization Em caso de exceção, debugger interativo permie analisar o problema diretamente no navegador; É possível habilitar um debug para exceções do tipo NotFound "debug_notfound" E também para debuggar a camada de autenticação "debug_authorization"
  • 60. Commnad line: pviews e proute Comandos disponíveis para visualização da configuração do projeto: 1 pviews development. i n i / 2 URL = / 3 context : <pyramid. traversal . DefaultRootFactory instance . . 4 view name: 5 Route: 6 −−−−−− 7 route name: home 8 route pattern : / 9 route path : / 10 subpath: 11 View: 12 −−−−− 13 pybr9project . views .my_view
  • 61. Add-ons Alguns exemplos de add-ons disponíveis para o Pyramid: Enviar email, autenticação LDAP Gerador de formulários: FormAlchemy, Deform Usar XML-RPC ou JSON-RPC Integração com jQuery Mobile Integração Beaker, Redis, MongoDB, etc.
  • 62. Class based e Function based views Pyramid tem o conceito unificado de view callable Funções, métodos de classe e instâncias (__call__) Exemplo de class view: 1 from pyramid. response import Response 2 from pyramid. view import view_config 3 4 class AView(object ) : 5 def __init__ ( self , request ) : 6 self . request = request 7 8 @view_config(route_name='view_one ' ) 9 def view_one( self ) : 10 return Response( 'one ' ) 11 12 @view_config(route_name='view_two ' ) 13 def view_two( self ) : 14 return Response( 'two ' )
  • 63. Asset specifications Asset specifications: são strings que contém o nome de um pacote python e um arquivo ou diretório. 1 MyPackage: static / index . html Extensível: não precisa depender de um global "static directory" Override: permite substituir a definição de um Asset configurado em outro pacote Para modificar um template específico basta sobrescrever o asset specification com a versão customizada
  • 64. Extensible templating Pyramid possui uma API preparada para plugar novos "renderers" Cada sistema de template é tratado como um renderer, tais como: Mako, Genshi, Chameleon e Jinja2 Você pode usar qualquer um desses templates da mesma forma que você usaria os template padrão É possível usar diferentes sistemas de template em um mesmo projeto
  • 65. Views com templates podem retornar dicionários Se você usa um template "renderer", sua view não precisa retornar um tipo especial de Response object Basta retornar um dicionário e o Pyramid vai cuidar de gerar um Response com o template escolhido 1 from pyramid. renderers import render_to_response 2 3 def myview( request ) : 4 return render_to_response ( 'myapp: templates /mytemplate. pt ' , 5 { 'a ' :1} , request=request ) 1 from pyramid. view import view_config 2 3 @view_config( renderer='myapp: templates /mytemplate. pt ' ) 4 def myview( request ) : 5 return { 'a ' :1}
  • 66. Sistema de Eventos Pyramid emite determinados eventos durante o ciclo de vida de cada Request Você pode registrar a quantidade necessária de listeners para caputurar esses eventos Por exemplo, se registrar um listener para o evento do tipo NewRequest, a cada novo request o listener será invocado O mesmo vale para o tipo de evento BeforeRender, que informa quando um template será renderizado A utilização de um sistema de eventos integrado ao Pyramid minimiza o uso de "hardcoded hooks" Você pode usar o sistema de eventos do Pyramid para gerar seus próprios eventos, os quais outras aplicações poderão capturar
  • 67. HTTP caching O Pyramid pode gerar os headers Cache-Control e Expires automaticamente para fazer cache de qualquer view facilmente. Basta fornecer o parâmetro http_cache para o decorador view_config, informando o tempo de cache em segundos 1 @view_config(http_cache=3600) # 60 minutes 2 def myview( request ) : ... .
  • 68. Controle de sessão Pyramid tem o recurso de sessão HTTP integrado E ao mesmo tempo ele permite que você use seu próprio sitema de sessão se você precisar Já existe um pacote que permite integrar e substituir o sitema de sessão padrão pelo Beaker Você pode trocar os sitemas de sessão sem necessitar qualquer modificação no seu código
  • 69. Desempenho e Velocidade O núcleo do Pyramid é marginalmente tão rápido quanto qualquer outro framework web em Python Ele foi desenvolvido desde seu princípio com foco em desemepenho Apenas o trabalho absolutamente necessário é realizado para desempenhar uma dada tarefa Chamda de funões desenecessárias e algoritimos sub otimizados são evitados É normal conseguir entre 3500 e 4000 requests por segundo em uma aplicação Pyramid simples + mod_wsgi ou gunicorn Referência de comparação: the-great-web-framework-shootout
  • 70. Exception views Pyramid permite que você registre uma ou mais "exception view" A view é invocadas quando ocorre uma exceção não tratada pela aplicação É possível registrar uma exception view para a execeção do tipo Exception (log e generic message) Ou para a Exception NotFound por exemplo, apenas para logar recursos não existentes 1 from pyramid. response import Response 2 3 @view_config( context=Exception) 4 def error_view(exc , request ) : 5 #log or do other stuff to exc ... 6 return Response( "Sorry there was an error " )
  • 71. No Singletons Não requer a construção de um “mutable globals” import de uma aplicação Pyramid não deve gerar qualquer “import-time side effects” Diferencial em relação aos app Flask e Django
  • 72. View predicates O decorator view_config possui uma série de predicados que podem ser usados para controlar a situação no qual a view estará disponível. No exemplo abaixo, tempo request_methos, context e name: 1 from resources import MyResource 2 from pyramid. view import view_config 3 from pyramid. response import Response 4 5 @view_config(name='my_view ' , request_method='POST ' , context=MyResource 6 permission='read ' ) 7 def my_view( request ) : 8 return Response( 'OK' ) Referência: viewconfig
  • 73. Transaction Management Pyramid scaffold configura o gerenciador de transações baseado no Zope Usando o gerenciador de transações não é preciso mais controlar o commit Ele cuida do committ: efetiva a transação no final do reguest ou aborta se uma exceção for levantada Ter um local central de para controlar as transações normalmente é muito útil É possível também sincronizar o commit entre múltiplos bancos de dados e realizar tarefas condicionalmente, como enviar email apenas se houver commit
  • 74. Outros recursos disponíveis Segue outros recursos importante que não serão vistos em detalhes: Internationalization integrada Detecção de conflitos de configuração Extensibilidade da Configuração Authentication and Authorization Traversal Tweens (plugins) View response adapters "Global"response object Automatizar configuração repetitiva Testes Suporte Documentação
  • 75. Tópicos Introdução História Princípios de Projeto Exemplos Perguntas Obrigado
  • 76. Perguntas?
  • 77. Tópicos Introdução História Princípios de Projeto Exemplos Perguntas Obrigado
  • 78. Pyramid O framework web para todos Rudá Porto Filgueiras - rudazz@gmail.com Twitter: rudaporto Github: rudaporto 02/10/2013 - PytthonBrasil[9] / PloneConf 2013

×