ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
Pyramid - O Framework Web para Todos
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!
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)
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!"
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"
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
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
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"
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