Pyramid - O Framework Web para Todos

Post on 18-Dec-2014

373 views 1 download

description

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

Transcript of Pyramid - O Framework Web para Todos

PyramidO framework web para todos

Rudá Porto Filgueiras - rudazz@gmail.com

Twitter: rudaporto Github: rudaporto

02/10/2013 - PytthonBrasil[9] / PloneConf 2013

Tópicos

Introdução

História

Princípios de Projeto

Exemplos

Perguntas

Obrigado

Tópicos

Introdução

História

Princípios de Projeto

Exemplos

Perguntas

Obrigado

Tópicos

Introdução

História

Princípios de Projeto

Exemplos

Perguntas

Obrigado

Tópicos

Introdução

História

Princípios de Projeto

Exemplos

Perguntas

Obrigado

Tópicos

Introdução

História

Princípios de Projeto

Exemplos

Perguntas

Obrigado

Tópicos

Introdução

História

Princípios de Projeto

Exemplos

Perguntas

Obrigado

Tópicos

Introdução

História

Princípios de Projeto

Exemplos

Perguntas

Obrigado

About Me

1 >>> import this2 The Zen of Python , by Tim Peters34 Beautiful is better than ugly .5 Expl ic i t is better than impl ic i t .6 Simple is better than complex.7 Complex is better than complicated .8 ...

I Usuário de Linux desde 1999

I Usuário de Zope desde 2001

I Usuário de Plone desde 2005

I Não sou desenvolvedor "full time"

I Membro Fundador da Associação Python Brasil

I Primeira PythonBrasil == 2

I Em busca de oportunidades e desafios!

Por que Pyramid?

I Simplicidade

I Desempenho

I Ambiente familiar : from Zope/Plone World

I Identificação com o projeto

I Mais detalhes adiante ...

Por que Pyramid?

I Simplicidade

I Desempenho

I Ambiente familiar : from Zope/Plone World

I Identificação com o projeto

I Mais detalhes adiante ...

Por que Pyramid?

I Simplicidade

I Desempenho

I Ambiente familiar : from Zope/Plone World

I Identificação com o projeto

I Mais detalhes adiante ...

Por que Pyramid?

I Simplicidade

I Desempenho

I Ambiente familiar : from Zope/Plone World

I Identificação com o projeto

I Mais detalhes adiante ...

Por que Pyramid?

I Simplicidade

I Desempenho

I Ambiente familiar : from Zope/Plone World

I Identificação com o projeto

I Mais detalhes adiante ...

Tópicos

Introdução

História

Princípios de Projeto

Exemplos

Perguntas

Obrigado

História

I Projeto repoze.zope2: suporte WSGI Zope2 (reescritaZPublisher)

I Problemas de compatibilidade com Zope2 motivaram acriação de um novo framework

I Zope3 foi avaliado, porém percebeu-se que ele levava amais indireções que o Zope2

I Pylons e Django não possuíam recursos comuns do Zope:traversal, declarative security e extensibilidade

I Nasceu o repose.bfg que teve sua primeira versão emjulho 2008

I No final de 2010 o projeto repoze.bfg foi renomeado paraPyramid e se integrou ao Pylons

I Seu desenvolvimento foi influenciado pelo Zope2, Zope3,Pylons 1.0 e Django

História

I Projeto repoze.zope2: suporte WSGI Zope2 (reescritaZPublisher)

I Problemas de compatibilidade com Zope2 motivaram acriação de um novo framework

I Zope3 foi avaliado, porém percebeu-se que ele levava amais indireções que o Zope2

I Pylons e Django não possuíam recursos comuns do Zope:traversal, declarative security e extensibilidade

I Nasceu o repose.bfg que teve sua primeira versão emjulho 2008

I No final de 2010 o projeto repoze.bfg foi renomeado paraPyramid e se integrou ao Pylons

I Seu desenvolvimento foi influenciado pelo Zope2, Zope3,Pylons 1.0 e Django

História

I Projeto repoze.zope2: suporte WSGI Zope2 (reescritaZPublisher)

I Problemas de compatibilidade com Zope2 motivaram acriação de um novo framework

I Zope3 foi avaliado, porém percebeu-se que ele levava amais indireções que o Zope2

I Pylons e Django não possuíam recursos comuns do Zope:traversal, declarative security e extensibilidade

I Nasceu o repose.bfg que teve sua primeira versão emjulho 2008

I No final de 2010 o projeto repoze.bfg foi renomeado paraPyramid e se integrou ao Pylons

I Seu desenvolvimento foi influenciado pelo Zope2, Zope3,Pylons 1.0 e Django

História

I Projeto repoze.zope2: suporte WSGI Zope2 (reescritaZPublisher)

I Problemas de compatibilidade com Zope2 motivaram acriação de um novo framework

I Zope3 foi avaliado, porém percebeu-se que ele levava amais indireções que o Zope2

I Pylons e Django não possuíam recursos comuns do Zope:traversal, declarative security e extensibilidade

I Nasceu o repose.bfg que teve sua primeira versão emjulho 2008

I No final de 2010 o projeto repoze.bfg foi renomeado paraPyramid e se integrou ao Pylons

I Seu desenvolvimento foi influenciado pelo Zope2, Zope3,Pylons 1.0 e Django

História

I Projeto repoze.zope2: suporte WSGI Zope2 (reescritaZPublisher)

I Problemas de compatibilidade com Zope2 motivaram acriação de um novo framework

I Zope3 foi avaliado, porém percebeu-se que ele levava amais indireções que o Zope2

I Pylons e Django não possuíam recursos comuns do Zope:traversal, declarative security e extensibilidade

I Nasceu o repose.bfg que teve sua primeira versão emjulho 2008

I No final de 2010 o projeto repoze.bfg foi renomeado paraPyramid e se integrou ao Pylons

I Seu desenvolvimento foi influenciado pelo Zope2, Zope3,Pylons 1.0 e Django

História

I Projeto repoze.zope2: suporte WSGI Zope2 (reescritaZPublisher)

I Problemas de compatibilidade com Zope2 motivaram acriação de um novo framework

I Zope3 foi avaliado, porém percebeu-se que ele levava amais indireções que o Zope2

I Pylons e Django não possuíam recursos comuns do Zope:traversal, declarative security e extensibilidade

I Nasceu o repose.bfg que teve sua primeira versão emjulho 2008

I No final de 2010 o projeto repoze.bfg foi renomeado paraPyramid e se integrou ao Pylons

I Seu desenvolvimento foi influenciado pelo Zope2, Zope3,Pylons 1.0 e Django

História

I Projeto repoze.zope2: suporte WSGI Zope2 (reescritaZPublisher)

I Problemas de compatibilidade com Zope2 motivaram acriação de um novo framework

I Zope3 foi avaliado, porém percebeu-se que ele levava amais indireções que o Zope2

I Pylons e Django não possuíam recursos comuns do Zope:traversal, declarative security e extensibilidade

I Nasceu o repose.bfg que teve sua primeira versão emjulho 2008

I No final de 2010 o projeto repoze.bfg foi renomeado paraPyramid e se integrou ao Pylons

I Seu desenvolvimento foi influenciado pelo Zope2, Zope3,Pylons 1.0 e Django

Tópicos

Introdução

História

Princípios de Projeto

Exemplos

Perguntas

Obrigado

Princípios de Projeto

Princípios que nortearam o desenvolvimento do Pyramid:

I Simplicidade

I Minimalismo

I Documentação

I Desempenho / Velocidade

I Confiabilidade

I Aberto (Openess)

Simplicidade

I "Pagar apenas por aquilo que se come"

I Permitir resultados práticos apenas com conhecimentoparcial do Pyramid

I Framework não deve forçar a utilização de umatecnologia específica

I Manutenção dos conceitos centrais ao mínimo necessário

I "Not build by aliens!"

Simplicidade

I "Pagar apenas por aquilo que se come"

I Permitir resultados práticos apenas com conhecimentoparcial do Pyramid

I Framework não deve forçar a utilização de umatecnologia específica

I Manutenção dos conceitos centrais ao mínimo necessário

I "Not build by aliens!"

Simplicidade

I "Pagar apenas por aquilo que se come"

I Permitir resultados práticos apenas com conhecimentoparcial do Pyramid

I Framework não deve forçar a utilização de umatecnologia específica

I Manutenção dos conceitos centrais ao mínimo necessário

I "Not build by aliens!"

Simplicidade

I "Pagar apenas por aquilo que se come"

I Permitir resultados práticos apenas com conhecimentoparcial do Pyramid

I Framework não deve forçar a utilização de umatecnologia específica

I Manutenção dos conceitos centrais ao mínimo necessário

I "Not build by aliens!"

Simplicidade

I "Pagar apenas por aquilo que se come"

I Permitir resultados práticos apenas com conhecimentoparcial do Pyramid

I Framework não deve forçar a utilização de umatecnologia específica

I Manutenção dos conceitos centrais ao mínimo necessário

I "Not build by aliens!"

Minimalismo

I O escopo do framewok limita-se ao desenvolvimento deaplicações Web

I Mapear as URLs ao códigoI Renderização de templates e viewsI Segurança / AutenticaçãoI Servir artefatos estáticos

I Obs: não contém ORM específico ou definição de umatecnologia de banco de dados "padrão"

Minimalismo

I O escopo do framewok limita-se ao desenvolvimento deaplicações Web

I Mapear as URLs ao código

I Renderização de templates e viewsI Segurança / AutenticaçãoI Servir artefatos estáticos

I Obs: não contém ORM específico ou definição de umatecnologia de banco de dados "padrão"

Minimalismo

I O escopo do framewok limita-se ao desenvolvimento deaplicações Web

I Mapear as URLs ao códigoI Renderização de templates e views

I Segurança / AutenticaçãoI Servir artefatos estáticos

I Obs: não contém ORM específico ou definição de umatecnologia de banco de dados "padrão"

Minimalismo

I O escopo do framewok limita-se ao desenvolvimento deaplicações Web

I Mapear as URLs ao códigoI Renderização de templates e viewsI Segurança / Autenticação

I Servir artefatos estáticos

I Obs: não contém ORM específico ou definição de umatecnologia de banco de dados "padrão"

Minimalismo

I O escopo do framewok limita-se ao desenvolvimento deaplicações Web

I Mapear as URLs ao códigoI Renderização de templates e viewsI Segurança / AutenticaçãoI Servir artefatos estáticos

I Obs: não contém ORM específico ou definição de umatecnologia de banco de dados "padrão"

Minimalismo

I O escopo do framewok limita-se ao desenvolvimento deaplicações Web

I Mapear as URLs ao códigoI Renderização de templates e viewsI Segurança / AutenticaçãoI Servir artefatos estáticos

I Obs: não contém ORM específico ou definição de umatecnologia de banco de dados "padrão"

Documentação

I Ser minimalista implica em maior facilidade para mantera documentação atualizada e completa

I O objetivo é que nenhum aspecto do Pyramid fique semdocumentação

Documentação

I Ser minimalista implica em maior facilidade para mantera documentação atualizada e completa

I O objetivo é que nenhum aspecto do Pyramid fique semdocumentação

Desempenho / Velocidade

I Projetado para prover alta velocidade de execução paraas tarefas comuns, tais como:

I Renderização de templates e viewsI E geração de respostas http para o browser: response

objects

Desempenho / Velocidade

I Projetado para prover alta velocidade de execução paraas tarefas comuns, tais como:

I Renderização de templates e views

I E geração de respostas http para o browser: responseobjects

Desempenho / Velocidade

I Projetado para prover alta velocidade de execução paraas tarefas comuns, tais como:

I Renderização de templates e viewsI E geração de respostas http para o browser: response

objects

Confiabilidade / Testes

I Pyramid é desenvolvido de forma conservadora e testadoexaustivamente

I Por definição: "Se não existe cobertura de testes o códigoestá quebrado"

Confiabilidade / Testes

I Pyramid é desenvolvido de forma conservadora e testadoexaustivamente

I Por definição: "Se não existe cobertura de testes o códigoestá quebrado"

Aberto (Openess)

I Como Python, o código fonte do Pyramid é distribuídosobre uma licença permissiva

Diferenciais Pyramid

I Gerenciador de transações

I Modelo de Configuração

I Traversal

I Flexibilidade das Views

I Tweens (plugins)

I Scaffolds

Diferenciais Pyramid

I Gerenciador de transações

I Modelo de Configuração

I Traversal

I Flexibilidade das Views

I Tweens (plugins)

I Scaffolds

Diferenciais Pyramid

I Gerenciador de transações

I Modelo de Configuração

I Traversal

I Flexibilidade das Views

I Tweens (plugins)

I Scaffolds

Diferenciais Pyramid

I Gerenciador de transações

I Modelo de Configuração

I Traversal

I Flexibilidade das Views

I Tweens (plugins)

I Scaffolds

Diferenciais Pyramid

I Gerenciador de transações

I Modelo de Configuração

I Traversal

I Flexibilidade das Views

I Tweens (plugins)

I Scaffolds

Diferenciais Pyramid

I Gerenciador de transações

I Modelo de Configuração

I Traversal

I Flexibilidade das Views

I Tweens (plugins)

I Scaffolds

Tópicos

Introdução

História

Princípios de Projeto

Exemplos

Perguntas

Obrigado

Hello World! - Aplicação em apenas um arquivo

1 from wsgiref . simple_server import make_server2 from pyramid . config import Configurator3 from pyramid . response import Response45 def hello_world ( request ) :6 return Response( ' Hello %(name)s! ' % request . matchdict )78 i f __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 ( )

Deploy

1 virtualenv −−no−site−packages deploy2 cd deploy3 source bin / activate4 easy_instal l i n s ta l l pyramid==1.4.5

Criando um projeto com Scaffold : template alchemy

1 # criando um novo pacote usando scaffold2 mkdir src3 pcreate −s alchemy src / PyBR9Project

1 # visualizando a estrutura do pacote :2 ls src / PyBR9Project / pybr9project34 __ in i t __ .py5 models .py6 scripts7 stat ic8 templates9 tests .py

10 views .py1112 # executando testes :13 python src / PyBR9Project / setup .py test

Instalando o pacote e inicializando a aplicação

1 # instalando pacotes para desenvolvimento :2 cd src / PyBR9Project3 python setup .py develop45 # in i t database6 initialize_PyBR9Project_db development . i n i78 # in i t web server9 pserve development . i n i

Abrir: http://localhost:6543/

Configuração utilizando Decorators

Os view decorators no Pyramid são inertes, apenasdetectados e ativados explicitamente.No __init__.py da raiz do pacotes: config.scan()

1 from pyramid . view import view_config2 from pyramid . response import Response34 @view_config(route_name=' turismo ' )5 def turismo_view( request ) :6 return Response( 'Pontos Turist icos ' )

Configuração de rotas e API para URL / PATH

Definição da rota:

1 # "config " instance of pyramid . config . Configurator2 config . add_route( ' turismo ' , ' / turismo ' , view=turismo_view)

Helpers para geração de URL ou PATH para um determinadarota:

1 url = request . route_url ( ' foo ' , one='1 ' , two='2 ' )2 # url : http : / / dominio / prefix /1/23 path = request . route_path ( ' foo ' , one='1 ' , two='2 ' )4 # path : prefix /1/2

Referência: urldispatch

Arquivos estáticos (static files)

I É possível servir mais de um conjunto de arquivosestáticos: /static e /static2

I Caminhos estáticos pode ser serrvidos diretamente deum webserver e o Pyramid gera URLs para esses arquivos

I Ambiente de desenvolvimento ou produção controladopelo arquivo .ini

1 # config is an instance of pyramid . config . Configurator2 config . add_static_view (name=' stat ic ' , path=' / var /www/ stat ic ' )3 # another way stat ic directory relat ive from package root4 config . add_static_view ( ' static_myapp ' , 'myapp: stat ic ' )

Barra de Debug: recursos

Scaffolds em geral habilitam debug toolbar emdevelopment.ini:

I rotas configuradas e ultimas renderizações executadas

I visualizar o conjunto atual de pacotes instalados

I acompanhar as consultas executadas no sqlalchemy

I visualizar os logs e várias outras informações darequisição

I add-on pyramid_debugtoolbar_mongo para visualizarinformações do MongoDB

Barra de Debug: notfound, authorization

Em caso de exceção, debugger interativo permie analisar oproblema diretamente no navegador;

I É possível habilitar um debug para exceções do tipoNotFound "debug_notfound"

I E também para debuggar a camada de autenticação"debug_authorization"

Commnad line: pviews e proute

Comandos disponíveis para visualização da configuração doprojeto:

1 pviews development . i n i /2 URL = /3 context : <pyramid . traversal . DefaultRootFactory instance . .4 view name:5 Route :6 −−−−−−7 route name: home8 route pattern : /9 route path : /

10 subpath :11 View:12 −−−−−13 pybr9project . views .my_view

Add-ons

Alguns exemplos de add-ons disponíveis para o Pyramid:

I Enviar email, autenticação LDAP

I Gerador de formulários: FormAlchemy, Deform

I Usar XML-RPC ou JSON-RPC

I Integração com jQuery Mobile

I Integração Beaker, Redis, MongoDB, etc.

Class based e Function based views

I Pyramid tem o conceito unificado de view callable

I Funções, métodos de classe e instâncias (__call__)

Exemplo de class view:

1 from pyramid . response import Response2 from pyramid . view import view_config34 class AView(object ) :5 def __init__ ( self , request ) :6 se l f . request = request78 @view_config(route_name='view_one ' )9 def view_one( se l f ) :

10 return Response( 'one ' )1112 @view_config(route_name='view_two ' )13 def view_two( se l f ) :14 return Response( 'two ' )

Asset specifications

Asset specifications: são strings que contém o nome de umpacote python e um arquivo ou diretório.

1 MyPackage: stat ic / index . html

I Extensível: não precisa depender de um global "staticdirectory"

I Override: permite substituir a definição de um Assetconfigurado em outro pacote

I Para modificar um template específico basta sobrescrevero asset specification com a versão customizada

Extensible templating

I Pyramid possui uma API preparada para plugar novos"renderers"

I Cada sistema de template é tratado como um renderer,tais como: Mako, Genshi, Chameleon e Jinja2

I Você pode usar qualquer um desses templates da mesmaforma que você usaria os template padrão

I É possível usar diferentes sistemas de template em ummesmo projeto

Views com templates podem retornar dicionários

I Se você usa um template "renderer", sua view nãoprecisa retornar um tipo especial de Response object

I Basta retornar um dicionário e o Pyramid vai cuidar degerar um Response com o template escolhido

1 from pyramid . renderers import render_to_response23 def myview( request ) :4 return render_to_response ( 'myapp: templates /mytemplate . pt ' ,5 { 'a ' :1} , request=request )

1 from pyramid . view import view_config23 @view_config( renderer='myapp: templates /mytemplate . pt ' )4 def myview( request ) :5 return { 'a ' :1}

Sistema de Eventos

I Pyramid emite determinados eventos durante o ciclo devida de cada Request

I Você pode registrar a quantidade necessária de listenerspara caputurar esses eventos

I Por exemplo, se registrar um listener para o evento dotipo NewRequest, a cada novo request o listener seráinvocado

I O mesmo vale para o tipo de evento BeforeRender, queinforma quando um template será renderizado

I A utilização de um sistema de eventos integrado aoPyramid minimiza o uso de "hardcoded hooks"

I Você pode usar o sistema de eventos do Pyramid paragerar seus próprios eventos, os quais outras aplicaçõespoderão capturar

HTTP caching

O Pyramid pode gerar os headers Cache-Control e Expiresautomaticamente para fazer cache de qualquer viewfacilmente.Basta fornecer o parâmetro http_cache para o decoradorview_config, informando o tempo de cache em segundos

1 @view_config(http_cache=3600) # 60 minutes2 def myview( request ) : ... .

Controle de sessão

I Pyramid tem o recurso de sessão HTTP integrado

I E ao mesmo tempo ele permite que você use seu própriositema de sessão se você precisar

I Já existe um pacote que permite integrar e substituir ositema de sessão padrão pelo Beaker

I Você pode trocar os sitemas de sessão sem necessitarqualquer modificação no seu código

Desempenho e Velocidade

I O núcleo do Pyramid é marginalmente tão rápido quantoqualquer outro framework web em Python

I Ele foi desenvolvido desde seu princípio com foco emdesemepenho

I Apenas o trabalho absolutamente necessário é realizadopara desempenhar uma dada tarefa

I Chamda de funões desenecessárias e algoritimos subotimizados são evitados

I É normal conseguir entre 3500 e 4000 requests porsegundo em uma aplicação Pyramid simples + mod_wsgiou gunicorn

I Referência de comparação:the-great-web-framework-shootout

Exception views

I Pyramid permite que você registre uma ou mais"exception view"

I A view é invocadas quando ocorre uma exceção nãotratada pela aplicação

I É possível registrar uma exception view para a execeçãodo tipo Exception (log e generic message)

I Ou para a Exception NotFound por exemplo, apenas paralogar recursos não existentes

1 from pyramid . response import Response23 @view_config( context=Exception)4 def error_view(exc , request ) :5 #log or do other stuf f to exc ...6 return Response( "Sorry there was an error " )

No Singletons

I Não requer a construção de um “mutable globals”

I import de uma aplicação Pyramid não deve gerarqualquer “import-time side effects”

I Diferencial em relação aos app Flask e Django

View predicates

O decorator view_config possui uma série de predicados quepodem ser usados para controlar a situação no qual a viewestará disponível.No exemplo abaixo, tempo request_methos, context e name:

1 from resources import MyResource2 from pyramid . view import view_config3 from pyramid . response import Response45 @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

Transaction Management

Pyramid scaffold configura o gerenciador de transaçõesbaseado no Zope

I Usando o gerenciador de transações não é preciso maiscontrolar o commit

I Ele cuida do committ: efetiva a transação no final doreguest ou aborta se uma exceção for levantada

I Ter um local central de para controlar as transaçõesnormalmente é muito útil

I É possível também sincronizar o commit entre múltiplosbancos de dados e realizar tarefas condicionalmente,como enviar email apenas se houver commit

Outros recursos disponíveisSegue outros recursos importante que não serão vistos emdetalhes:

I Internationalization integrada

I Detecção de conflitos de configuração

I Extensibilidade da Configuração

I Authentication and Authorization

I Traversal

I Tweens (plugins)

I View response adapters

I "Global"response object

I Automatizar configuração repetitiva

I Testes

I Suporte

I Documentação

Tópicos

Introdução

História

Princípios de Projeto

Exemplos

Perguntas

Obrigado

Perguntas?

Tópicos

Introdução

História

Princípios de Projeto

Exemplos

Perguntas

Obrigado

PyramidO framework web para todos

Rudá Porto Filgueiras - rudazz@gmail.com

Twitter: rudaporto Github: rudaporto

02/10/2013 - PytthonBrasil[9] / PloneConf 2013