SlideShare uma empresa Scribd logo
1 de 78
Baixar para ler offline
Pyramid
O 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
Tópicos
Introdução
História
Tópicos
Introdução
História
Princípios de Projeto
Tópicos
Introdução
História
Princípios de Projeto
Exemplos
Tópicos
Introdução
História
Princípios de Projeto
Exemplos
Perguntas
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 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!
Por que Pyramid?
Simplicidade
Por que Pyramid?
Simplicidade
Desempenho
Por que Pyramid?
Simplicidade
Desempenho
Ambiente familiar : from Zope/Plone World
Por que Pyramid?
Simplicidade
Desempenho
Ambiente familiar : from Zope/Plone World
Identificação com o projeto
Por que Pyramid?
Simplicidade
Desempenho
Ambiente familiar : from Zope/Plone World
Identificação com o projeto
Mais detalhes adiante ...
Tópicos
Introdução
História
Princípios de Projeto
Exemplos
Perguntas
Obrigado
História
Projeto repoze.zope2: suporte WSGI Zope2 (reescrita
ZPublisher)
História
Projeto repoze.zope2: suporte WSGI Zope2 (reescrita
ZPublisher)
Problemas de compatibilidade com Zope2 motivaram a
criação de um novo framework
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
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
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
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
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
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:
Simplicidade
Minimalismo
Documentação
Desempenho / Velocidade
Confiabilidade
Aberto (Openess)
Simplicidade
"Pagar apenas por aquilo que se come"
Simplicidade
"Pagar apenas por aquilo que se come"
Permitir resultados práticos apenas com conhecimento
parcial do Pyramid
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
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
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!"
Minimalismo
O escopo do framewok limita-se ao desenvolvimento de
aplicações Web
Minimalismo
O escopo do framewok limita-se ao desenvolvimento de
aplicações Web
Mapear as URLs ao código
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
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
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
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"
Documentação
Ser minimalista implica em maior facilidade para manter
a documentação atualizada e completa
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
Desempenho / Velocidade
Projetado para prover alta velocidade de execução para
as tarefas comuns, tais como:
Desempenho / Velocidade
Projetado para prover alta velocidade de execução para
as tarefas comuns, tais como:
Renderização de templates e views
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
Confiabilidade / Testes
Pyramid é desenvolvido de forma conservadora e testado
exaustivamente
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"
Aberto (Openess)
Como Python, o código fonte do Pyramid é distribuído
sobre uma licença permissiva
Diferenciais Pyramid
Gerenciador de transações
Diferenciais Pyramid
Gerenciador de transações
Modelo de Configuração
Diferenciais Pyramid
Gerenciador de transações
Modelo de Configuração
Traversal
Diferenciais Pyramid
Gerenciador de transações
Modelo de Configuração
Traversal
Flexibilidade das Views
Diferenciais Pyramid
Gerenciador de transações
Modelo de Configuração
Traversal
Flexibilidade das Views
Tweens (plugins)
Diferenciais Pyramid
Gerenciador de transações
Modelo de Configuração
Traversal
Flexibilidade das Views
Tweens (plugins)
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_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 ()
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
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
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/
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 ' )
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
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 ' )
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
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"
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
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.
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 ' )
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
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
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}
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
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 ) : ... .
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
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
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 " )
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
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
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
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
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
Pyramid
O framework web para todos
Rudá Porto Filgueiras - rudazz@gmail.com
Twitter: rudaporto Github: rudaporto
02/10/2013 - PytthonBrasil[9] / PloneConf 2013

Mais conteúdo relacionado

Mais procurados

Django - Desenvolvimento web ágil com Python
Django - Desenvolvimento web ágil com PythonDjango - Desenvolvimento web ágil com Python
Django - Desenvolvimento web ágil com PythonIgor Sobreira
 
CEPUG 2 - Bem-vindo a Framework CodeIgniter
CEPUG 2 - Bem-vindo a Framework CodeIgniterCEPUG 2 - Bem-vindo a Framework CodeIgniter
CEPUG 2 - Bem-vindo a Framework CodeIgniterEric Silva
 
Criando API Rest no Zend Framework 2
Criando API Rest no Zend Framework 2Criando API Rest no Zend Framework 2
Criando API Rest no Zend Framework 2Rankest
 
Mini curso de django
Mini curso de djangoMini curso de django
Mini curso de djangorosenclever
 
Aprendendo Angular com a CLI
Aprendendo Angular com a CLIAprendendo Angular com a CLI
Aprendendo Angular com a CLIVanessa Me Tonini
 
Performance de verdade com Phalcon Framework
Performance de verdade com Phalcon FrameworkPerformance de verdade com Phalcon Framework
Performance de verdade com Phalcon FrameworkJaime Neto
 
Desenvolvendo com Angular CLI
Desenvolvendo com Angular CLIDesenvolvendo com Angular CLI
Desenvolvendo com Angular CLIVanessa Me Tonini
 
Seu framework é melhor pra quê?
Seu framework é melhor pra quê?Seu framework é melhor pra quê?
Seu framework é melhor pra quê?Jaime Neto
 
Por que jenkins se posso usar deployer php
Por que jenkins se posso usar deployer php Por que jenkins se posso usar deployer php
Por que jenkins se posso usar deployer php Michael Douglas
 
Trabalhando de forma profissional com silex
Trabalhando de forma profissional com silexTrabalhando de forma profissional com silex
Trabalhando de forma profissional com silexMichael Douglas
 
Adcut's presentation (Master's Assignment)
Adcut's presentation (Master's Assignment)Adcut's presentation (Master's Assignment)
Adcut's presentation (Master's Assignment)Leonardo Pereira
 
Zend Framework 2 - Desenvolvimento Ágil Competente
Zend Framework 2 - Desenvolvimento Ágil CompetenteZend Framework 2 - Desenvolvimento Ágil Competente
Zend Framework 2 - Desenvolvimento Ágil CompetenteMichael Cardoso
 
Django: desenvolvendo aplicações web de maneira simples e rápida!
Django: desenvolvendo aplicações web de maneira simples e rápida!Django: desenvolvendo aplicações web de maneira simples e rápida!
Django: desenvolvendo aplicações web de maneira simples e rápida!Felipe Queiroz
 
Começando com Zend Framework 2
Começando com Zend Framework 2Começando com Zend Framework 2
Começando com Zend Framework 2Cezar Souza
 
Composer dependency manager - TDC - POA 2017
Composer   dependency manager - TDC - POA 2017Composer   dependency manager - TDC - POA 2017
Composer dependency manager - TDC - POA 2017Vitor Mattos
 
Construindo uma API, Client e Documentação usando Silex, Angular e Swagger
Construindo uma API, Client e Documentação usando Silex, Angular e SwaggerConstruindo uma API, Client e Documentação usando Silex, Angular e Swagger
Construindo uma API, Client e Documentação usando Silex, Angular e SwaggerDelermando Santos Miranda
 
Microsoft Community Launch 2010: .NET Framework 4
Microsoft Community Launch 2010: .NET Framework 4Microsoft Community Launch 2010: .NET Framework 4
Microsoft Community Launch 2010: .NET Framework 4Rogério Moraes de Carvalho
 

Mais procurados (20)

Django - Desenvolvimento web ágil com Python
Django - Desenvolvimento web ágil com PythonDjango - Desenvolvimento web ágil com Python
Django - Desenvolvimento web ágil com Python
 
CEPUG 2 - Bem-vindo a Framework CodeIgniter
CEPUG 2 - Bem-vindo a Framework CodeIgniterCEPUG 2 - Bem-vindo a Framework CodeIgniter
CEPUG 2 - Bem-vindo a Framework CodeIgniter
 
Criando API Rest no Zend Framework 2
Criando API Rest no Zend Framework 2Criando API Rest no Zend Framework 2
Criando API Rest no Zend Framework 2
 
Python na Web
Python na WebPython na Web
Python na Web
 
Mini curso de django
Mini curso de djangoMini curso de django
Mini curso de django
 
Aprendendo Angular com a CLI
Aprendendo Angular com a CLIAprendendo Angular com a CLI
Aprendendo Angular com a CLI
 
Performance de verdade com Phalcon Framework
Performance de verdade com Phalcon FrameworkPerformance de verdade com Phalcon Framework
Performance de verdade com Phalcon Framework
 
Controle de versão com Git
Controle de versão com GitControle de versão com Git
Controle de versão com Git
 
Desenvolvendo com Angular CLI
Desenvolvendo com Angular CLIDesenvolvendo com Angular CLI
Desenvolvendo com Angular CLI
 
Seu framework é melhor pra quê?
Seu framework é melhor pra quê?Seu framework é melhor pra quê?
Seu framework é melhor pra quê?
 
Por que jenkins se posso usar deployer php
Por que jenkins se posso usar deployer php Por que jenkins se posso usar deployer php
Por que jenkins se posso usar deployer php
 
Trabalhando de forma profissional com silex
Trabalhando de forma profissional com silexTrabalhando de forma profissional com silex
Trabalhando de forma profissional com silex
 
Adcut's presentation (Master's Assignment)
Adcut's presentation (Master's Assignment)Adcut's presentation (Master's Assignment)
Adcut's presentation (Master's Assignment)
 
Zend Framework 2 - Desenvolvimento Ágil Competente
Zend Framework 2 - Desenvolvimento Ágil CompetenteZend Framework 2 - Desenvolvimento Ágil Competente
Zend Framework 2 - Desenvolvimento Ágil Competente
 
Django: desenvolvendo aplicações web de maneira simples e rápida!
Django: desenvolvendo aplicações web de maneira simples e rápida!Django: desenvolvendo aplicações web de maneira simples e rápida!
Django: desenvolvendo aplicações web de maneira simples e rápida!
 
Começando com Zend Framework 2
Começando com Zend Framework 2Começando com Zend Framework 2
Começando com Zend Framework 2
 
Composer dependency manager - TDC - POA 2017
Composer   dependency manager - TDC - POA 2017Composer   dependency manager - TDC - POA 2017
Composer dependency manager - TDC - POA 2017
 
Construindo uma API, Client e Documentação usando Silex, Angular e Swagger
Construindo uma API, Client e Documentação usando Silex, Angular e SwaggerConstruindo uma API, Client e Documentação usando Silex, Angular e Swagger
Construindo uma API, Client e Documentação usando Silex, Angular e Swagger
 
Maven em 10 minutos
Maven em 10 minutosMaven em 10 minutos
Maven em 10 minutos
 
Microsoft Community Launch 2010: .NET Framework 4
Microsoft Community Launch 2010: .NET Framework 4Microsoft Community Launch 2010: .NET Framework 4
Microsoft Community Launch 2010: .NET Framework 4
 

Destaque

MySql Historia, Ventajas, Importancia
MySql Historia, Ventajas, ImportanciaMySql Historia, Ventajas, Importancia
MySql Historia, Ventajas, ImportanciaLenin Araque
 
Teg jenniree diaz (2014)
Teg jenniree diaz (2014) Teg jenniree diaz (2014)
Teg jenniree diaz (2014) Daniel Flores
 
Python Eve - APIs RESTful Profissionais em poucas linhas
Python Eve - APIs RESTful Profissionais em poucas linhasPython Eve - APIs RESTful Profissionais em poucas linhas
Python Eve - APIs RESTful Profissionais em poucas linhasRuda Filgueiras
 
Big data con Hadoop y SSIS 2016
Big data con Hadoop y SSIS 2016Big data con Hadoop y SSIS 2016
Big data con Hadoop y SSIS 2016Ángel Rayo
 
Debian caracteristicas
Debian caracteristicas Debian caracteristicas
Debian caracteristicas wolf_dragons
 

Destaque (6)

MySql Historia, Ventajas, Importancia
MySql Historia, Ventajas, ImportanciaMySql Historia, Ventajas, Importancia
MySql Historia, Ventajas, Importancia
 
Teg jenniree diaz (2014)
Teg jenniree diaz (2014) Teg jenniree diaz (2014)
Teg jenniree diaz (2014)
 
Python Eve - APIs RESTful Profissionais em poucas linhas
Python Eve - APIs RESTful Profissionais em poucas linhasPython Eve - APIs RESTful Profissionais em poucas linhas
Python Eve - APIs RESTful Profissionais em poucas linhas
 
Big data con Hadoop y SSIS 2016
Big data con Hadoop y SSIS 2016Big data con Hadoop y SSIS 2016
Big data con Hadoop y SSIS 2016
 
Star uml
Star umlStar uml
Star uml
 
Debian caracteristicas
Debian caracteristicas Debian caracteristicas
Debian caracteristicas
 

Semelhante a Framework web Pyramid

Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...
Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...
Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...Daniel Makiyama
 
Play Framework - Desenvolvendo Aplicações Web com Java sem Dor
Play Framework - Desenvolvendo Aplicações Web com Java sem DorPlay Framework - Desenvolvendo Aplicações Web com Java sem Dor
Play Framework - Desenvolvendo Aplicações Web com Java sem DorAllyson Barros
 
Desenvolvimento web com python e django
Desenvolvimento web com python e djangoDesenvolvimento web com python e django
Desenvolvimento web com python e djangoIgor Sobreira
 
Solucionando a Teoria do Caos com Cypress.io
Solucionando a Teoria do Caos com Cypress.ioSolucionando a Teoria do Caos com Cypress.io
Solucionando a Teoria do Caos com Cypress.ioPatrick Monteiro
 
ASP.NET vNext no .NET Architects Days 2014
ASP.NET vNext no .NET Architects Days 2014ASP.NET vNext no .NET Architects Days 2014
ASP.NET vNext no .NET Architects Days 2014Giovanni Bassi
 
Criando microsserviços em PHP
Criando microsserviços em PHPCriando microsserviços em PHP
Criando microsserviços em PHPFlávio Lisboa
 
Angular5, vue js ou react redux (Trilha de Javascript - TDC 2018 )
Angular5, vue js ou react redux (Trilha de Javascript - TDC 2018 )Angular5, vue js ou react redux (Trilha de Javascript - TDC 2018 )
Angular5, vue js ou react redux (Trilha de Javascript - TDC 2018 )Getúlio Strapazzon
 
Play - Full Stack Java Web Framework
Play -  Full Stack Java Web FrameworkPlay -  Full Stack Java Web Framework
Play - Full Stack Java Web FrameworkMauricio Carvalho
 
SATADS 2019 - Desenvolvimento com recursos da AWS
SATADS 2019 - Desenvolvimento com recursos da AWSSATADS 2019 - Desenvolvimento com recursos da AWS
SATADS 2019 - Desenvolvimento com recursos da AWSAnderson Contreira
 
Construir microservices em python nunca foi tão simples como com o Nameko!
Construir microservices em python nunca foi tão simples como com o Nameko!Construir microservices em python nunca foi tão simples como com o Nameko!
Construir microservices em python nunca foi tão simples como com o Nameko!Flávio Pimenta
 
Introdução ao JBoss Fuse 6.x: criação e implantação de um serviço CXF
Introdução ao JBoss Fuse 6.x: criação e implantação de um serviço CXFIntrodução ao JBoss Fuse 6.x: criação e implantação de um serviço CXF
Introdução ao JBoss Fuse 6.x: criação e implantação de um serviço CXFRafael T. C. Soares (tuelho)
 
Python Brasil[9] - Entrega Contínua
Python Brasil[9] - Entrega Contínua Python Brasil[9] - Entrega Contínua
Python Brasil[9] - Entrega Contínua Renzo Nuccitelli
 
XML Free Programming - Brazil
XML Free Programming - BrazilXML Free Programming - Brazil
XML Free Programming - BrazilStephen Chin
 
Criando Aplicações .NET com o TheWebMind
Criando Aplicações .NET com o TheWebMindCriando Aplicações .NET com o TheWebMind
Criando Aplicações .NET com o TheWebMindJaydson Gomes
 
Palestra - Symfony Framework MVC PHP 5
Palestra - Symfony Framework MVC PHP 5Palestra - Symfony Framework MVC PHP 5
Palestra - Symfony Framework MVC PHP 5Lucas Augusto Carvalho
 

Semelhante a Framework web Pyramid (20)

Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...
Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...
Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...
 
Framework web 01 - Aula UTFPR 2018
Framework web 01 - Aula UTFPR 2018Framework web 01 - Aula UTFPR 2018
Framework web 01 - Aula UTFPR 2018
 
Play Framework - Desenvolvendo Aplicações Web com Java sem Dor
Play Framework - Desenvolvendo Aplicações Web com Java sem DorPlay Framework - Desenvolvendo Aplicações Web com Java sem Dor
Play Framework - Desenvolvendo Aplicações Web com Java sem Dor
 
Desenvolvimento web com python e django
Desenvolvimento web com python e djangoDesenvolvimento web com python e django
Desenvolvimento web com python e django
 
Solucionando a Teoria do Caos com Cypress.io
Solucionando a Teoria do Caos com Cypress.ioSolucionando a Teoria do Caos com Cypress.io
Solucionando a Teoria do Caos com Cypress.io
 
W2py pyconpe
W2py pyconpeW2py pyconpe
W2py pyconpe
 
ASP.NET vNext no .NET Architects Days 2014
ASP.NET vNext no .NET Architects Days 2014ASP.NET vNext no .NET Architects Days 2014
ASP.NET vNext no .NET Architects Days 2014
 
Criando microsserviços em PHP
Criando microsserviços em PHPCriando microsserviços em PHP
Criando microsserviços em PHP
 
Angular5, vue js ou react redux (Trilha de Javascript - TDC 2018 )
Angular5, vue js ou react redux (Trilha de Javascript - TDC 2018 )Angular5, vue js ou react redux (Trilha de Javascript - TDC 2018 )
Angular5, vue js ou react redux (Trilha de Javascript - TDC 2018 )
 
Play - Full Stack Java Web Framework
Play -  Full Stack Java Web FrameworkPlay -  Full Stack Java Web Framework
Play - Full Stack Java Web Framework
 
SATADS 2019 - Desenvolvimento com recursos da AWS
SATADS 2019 - Desenvolvimento com recursos da AWSSATADS 2019 - Desenvolvimento com recursos da AWS
SATADS 2019 - Desenvolvimento com recursos da AWS
 
Construir microservices em python nunca foi tão simples como com o Nameko!
Construir microservices em python nunca foi tão simples como com o Nameko!Construir microservices em python nunca foi tão simples como com o Nameko!
Construir microservices em python nunca foi tão simples como com o Nameko!
 
Introdução ao JBoss Fuse 6.x: criação e implantação de um serviço CXF
Introdução ao JBoss Fuse 6.x: criação e implantação de um serviço CXFIntrodução ao JBoss Fuse 6.x: criação e implantação de um serviço CXF
Introdução ao JBoss Fuse 6.x: criação e implantação de um serviço CXF
 
Python Brasil[9] - Entrega Contínua
Python Brasil[9] - Entrega Contínua Python Brasil[9] - Entrega Contínua
Python Brasil[9] - Entrega Contínua
 
XML Free Programming - Brazil
XML Free Programming - BrazilXML Free Programming - Brazil
XML Free Programming - Brazil
 
Introdução Play framework
Introdução Play frameworkIntrodução Play framework
Introdução Play framework
 
Criando Aplicações .NET com o TheWebMind
Criando Aplicações .NET com o TheWebMindCriando Aplicações .NET com o TheWebMind
Criando Aplicações .NET com o TheWebMind
 
Django
DjangoDjango
Django
 
Palestra - Symfony Framework MVC PHP 5
Palestra - Symfony Framework MVC PHP 5Palestra - Symfony Framework MVC PHP 5
Palestra - Symfony Framework MVC PHP 5
 
Debug de cabo a rabo
Debug de cabo a raboDebug de cabo a rabo
Debug de cabo a rabo
 

Framework web Pyramid

  • 1. Pyramid O framework web para todos Rudá Porto Filgueiras - rudazz@gmail.com Twitter: rudaporto Github: rudaporto 02/10/2013 - PytthonBrasil[9] / PloneConf 2013
  • 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!
  • 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 ...
  • 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
  • 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
  • 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
  • 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
  • 78. Pyramid O framework web para todos Rudá Porto Filgueiras - rudazz@gmail.com Twitter: rudaporto Github: rudaporto 02/10/2013 - PytthonBrasil[9] / PloneConf 2013