O documento discute o framework web Grok, incluindo conceitos como aplicações, modelos, containers e views. Também aborda tópicos como formulários, adapters, utilities e interfaces.
1. Grok - mais um framework web Programando com o Grok M´dulos externos
o Considera¸˜es Finais
co
Diego Manh˜es Pinheiro
a
N´cleo de Pesquisa em Sistemas de Informa¸˜o
u ca
Instituto Federal Fluminense - Campus Campos Centro
me@dmpinheiro.net
27 de Setembro de 2010
2. Grok - mais um framework web Programando com o Grok M´dulos externos
o Considera¸˜es Finais
co
3. Grok - mais um framework web Programando com o Grok M´dulos externos
o Considera¸˜es Finais
co
ZODB
4. Grok - mais um framework web Programando com o Grok M´dulos externos
o Considera¸˜es Finais
co
5. Grok - mais um framework web Programando com o Grok M´dulos externos
o Considera¸˜es Finais
co
Componentes
6. Grok - mais um framework web Programando com o Grok M´dulos externos
o Considera¸˜es Finais
co
7. Grok - mais um framework web Programando com o Grok M´dulos externos
o Considera¸˜es Finais
co
wget http://python-distribute.org/distribute_setup.py
python2.6 distribute_setup.py
easy_install pip
pip install virtualenv
virtualenv ~/grokenv
source ~/grokenv/bin/activate
easy_install pip
pip install grokproject
grokproject example
8. Grok - mais um framework web Programando com o Grok M´dulos externos
o Considera¸˜es Finais
co
import grok
class Example(grok.Application, grok.Container):
pass
class Index(grok.View):
pass # see app_templates/index.pt
9. Grok - mais um framework web Programando com o Grok M´dulos externos
o Considera¸˜es Finais
co
<html>
<head>
</head>
<body>
<h1>Congratulations!</h1>
<p>Your Grok application is up and running.
Edit <code>example/app_templates/index.pt</code> to change
this page.</p>
</body>
</html>
10. Grok - mais um framework web Programando com o Grok M´dulos externos
o Considera¸˜es Finais
co
Conceitos b´sicos
a
• Application - Representa o sistema.
• View - Descreve um endere¸o para acesso web.
c
• Model - Descreve um conceito de neg´cio
o
simples.
• Container - Descreve um objeto de neg´cio que
o
pode conter outros objetos.
11. Grok - mais um framework web Programando com o Grok M´dulos externos
o Considera¸˜es Finais
co
Criando duas Applica¸˜es
co
bin/paster serve parts/etc/debug.ini
Traceback (most recent call last):
File ".../scan.py", line 40, in check_module_component
File ".../etc/site.zcml", line 4.2-4.31
File ".../src/example/configure.zcml", line 5.2-5.27
GrokError: Multiple possible contexts for <class ’example.app.Index’>,
please use the ’context’ directive.
12. Grok - mais um framework web Programando com o Grok M´dulos externos
o Considera¸˜es Finais
co
View
• Associada a um objeto de neg´cio.
o
• M´todo render ´ chamado toda vez que a
e e
p´gina ´ acessada.
a e
• Nome da classe ´ torna-se parte do endere¸o
e c
URL.
´
• E poss´ ıvel adicionar images atrav´s da vari´vel
e a
static.
• View ´ associada automaticamente com a
e
classe.
13. Grok - mais um framework web Programando com o Grok M´dulos externos
o Considera¸˜es Finais
co
Entendendo o esquema de publica¸˜o de
ca
objetos
http://localhost:8080/app01/1/editar
• http://localhost:8080 - Endere¸o onde o
c
servidor onde o framework est´ funcionando.
a
• app01 - Nome da Aplica¸˜o
ca
• 1 - nome de um objeto
• editar - nome da view
14. Grok - mais um framework web Programando com o Grok M´dulos externos
o Considera¸˜es Finais
co
Model
import grok
from persistent.list import PersistentList
class Carro(grok.Model):
def __init__(self,nome, modelo=None,ano=No
self.nome
self.modelo=None
self.ano=None
self.opcionais = PersistentList(opcion
def say_greetings(self):
print "Hello, my friend! Stay awhile a
15. Grok - mais um framework web Programando com o Grok M´dulos externos
o Considera¸˜es Finais
co
Container
• Objetos que cont´m outros objetos.
e
• Usa a API de dicion´rio.
a
• identificador utilizado torna-se parte da URL.
16. Grok - mais um framework web Programando com o Grok M´dulos externos
o Considera¸˜es Finais
co
C´digo criando um Container
o
import grok
class Example(grok.Application, grok.Container):
pass
class Content(grok.Model):
pass
17. Grok - mais um framework web Programando com o Grok M´dulos externos
o Considera¸˜es Finais
co
C´digo usando um Container
o
:Test-Layer: functional
>>> from example.app import Example, Content
>>> root = getRootFolder()
>>> root[’app’] = app = Example()
>>> first_content = Content()
>>> app[’first’] = first_content
>>> app[’second’] = Content()
>>> list(app.keys())
[u’first’, u’second’]
>>> list(app.values()) #doctest: +ELLIPSIS
[<example.app.Content object at ... >, <example.app.Content object at ... >
>>> app.has_key(2)
True
>>> app.items()
[(’first’,<>),(2,<>)]
>>> len(app)
2
>>> app.get(’first’)
<>
18. Grok - mais um framework web Programando com o Grok M´dulos externos
o Considera¸˜es Finais
co
Container
• Usa a API de dicion´rio.
a
• identificador utilizado torna-se parte da URL.
19. Grok - mais um framework web Programando com o Grok M´dulos externos
o Considera¸˜es Finais
co
Forms
• Mecanismo para a defini¸˜o de formul´rios.
ca a
• Utiliza o conceito de widgets.
´
• E poss´
ıvel criar sua pr´prias widgets.
o
• DisplayForm, EditForm, AddForm
20. Grok - mais um framework web Programando com o Grok M´dulos externos
o Considera¸˜es Finais
co
Forms
import grok
from models import Person
from example.app import Example
from zope.formlib.widgets import RadioWidget as _RadioWidget
from zope.schema import Bool, TextLine, Datetime, Choice
import uuid
class Index(grok.View):
grok.context(Example)
def list_of_persons(self):
return self.context.keys()
def RadioWidget(field, request):
vocabulary = field.vocabulary
widget = _RadioWidget(field, vocabulary, request)
return widget
PERSON_FIELDS = {’name’: TextLine(title=u’Nome’,description=u’Informe o teu nome:’),
’date_of_birth’: Datetime(title=u’Data de Nascimento’,
description=u’Informe sua data de nascimento’),
’gender’: Choice(title=u’Sexo’,description=u’’,values=(u’Masculino’,u’Feminino’,))}
class ViewPerson(grok.DisplayForm):
grok.name(’index’)
grok.context(Person)
form_fields = grok.Fields(**PERSON_FIELDS)
21. Grok - mais um framework web Programando com o Grok M´dulos externos
o Considera¸˜es Finais
co
Forms
import grok
class Example(grok.Application, grok.Container):
pass
22. Grok - mais um framework web Programando com o Grok M´dulos externos
o Considera¸˜es Finais
co
Viewlet
• Define uma ´rea que pode ser compartilhada
a
entre v´rias vis˜es.
a o
´
• E associada a um viewletmanager, que ´ a
e
respons´vel por
a
23. Grok - mais um framework web Programando com o Grok M´dulos externos
o Considera¸˜es Finais
co
ViewletManager
import grok
class Example(grok.Application, grok.Container
pass
class Index(grok.View):
pass
class AreadoUsuario(grok.ViewletManager):
grok.view(Index)
grok.name(’example.main’)
24. Grok - mais um framework web Programando com o Grok M´dulos externos
o Considera¸˜es Finais
co
Princ´
ıpios de O.O.
Program to a interface, not to a implementation.
Composition over inheritance.
Depend upon abstractions (interfaces), not upon
concrete classes.
25. Grok - mais um framework web Programando com o Grok M´dulos externos
o Considera¸˜es Finais
co
Definindo Interfaces com Python
Esque¸a sobre classes e sobre conceitos
c
complicados. Interfaces permitem:
• Permite expor uma API.
• Permite que mecanismos consultem uma
interface.
• Interfaces precisam ser declaradas como
implementadas na defini¸˜o da sua classe.
ca
26. Grok - mais um framework web Programando com o Grok M´dulos externos
o Considera¸˜es Finais
co
Utility
Conhecido tamb´m como Service Pattern.
e
• Funciona utilizando uma interface como
consulta.
• O m´dulo zope.component ´ o teu amigo.
o e
• Usando uma interface como base pode-se ter
v´rias Utility.
a
27. Grok - mais um framework web Programando com o Grok M´dulos externos
o Considera¸˜es Finais
co
import grok
from datetime import datetime
from example.interfaces import IDateUtility, I
class Example(grok.Application, grok.Container
pass
class Index(grok.View):
grok.context(Example)
class ComicQuizUtility(grok.LocalUtility):
grok.name("comic")
28. Grok - mais um framework web Programando com o Grok M´dulos externos
o Considera¸˜es Finais
co
:Test-Layer: functional
>>> from example.app import Example
>>> from example.interfaces import IDateUti
>>> root = getRootFolder()
>>> root[’app’] = Example()
>>> import zope.component
>>> date_utility = zope.component.getUtilit
>>> date_utility.now().strftime(’%d/%m/%Y’)
’27/09/2010’
>>> quiz_utility = zope.component.getUtilit
Traceback (most recent call last):
...
ComponentLookupError: (<InterfaceClass exam
29. Grok - mais um framework web Programando com o Grok M´dulos externos
o Considera¸˜es Finais
co
GlobalUtility
Funciona como o Service s´ que ´ valido para
o e
qualquer aplica¸˜o.
ca
30. Grok - mais um framework web Programando com o Grok M´dulos externos
o Considera¸˜es Finais
co
Adapter
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import grok
from interfaces import IPortaVGA, IPortaMiniDVI
class Example(grok.Application, grok.Container):
pass
class Index(grok.View):
pass # see app_templates/index.pt
class AdaptadorDVItoVGA(grok.Adapter):
grok.implements(IPortaVGA)
grok.context(IPortaMiniDVI)
def conectar_entrada_vga(self,cable):
self.context.conectar_entrada_minidvi(self)
print "Conectando o adaptador VGA."
class Macbook(object):
grok.implements(IPortaMiniDVI)
def conectar_entrada_minidvi(self, cable):
print "Conectando na Porta MiniDVI em um Macbook."
class NotebookHP(object):
grok.implements(IPortaVGA)
31. Grok - mais um framework web Programando com o Grok M´dulos externos
o Considera¸˜es Finais
co
MultiAdapter
:Test-Layer: functional
>>> from example.app import Macbook, NotebookHP, Projetor
>>> from example.app import plugar_laptop_em_um_projetor
>>> meu_notebook = Macbook()
>>> projetor_da_apresentacao = Projetor()
>>> plugar_laptop_em_um_projetor(meu_notebook,projetor_da_apresentacao)
Conectando na Porta MiniDVI em um Macbook.
Conectando o adaptador VGA.
>>> notebook_do_elesbom = NotebookHP()
>>> plugar_laptop_em_um_projetor(notebook_do_elesbom,projetor_da_apresentacao)
Conectando na porta VGA de um notebook HP.
>>> from zope.component import getAdapter,queryAdapter
>>> from example.interfaces import IPortaVGA
>>> adaptador = queryAdapter(meu_notebook,IPortaVGA)
>>> type(adaptador)
<class ’example.app.AdaptadorDVItoVGA’>
>>> outro_adaptador = getAdapter(notebook_do_elesbom,IPortaVGA)
Traceback (most recent call last):
...
ComponentLookupError: (<example.app.NotebookHP object at ... <InterfaceClass example.interfaces.IPortaVG
32. Grok - mais um framework web Programando com o Grok M´dulos externos
o Considera¸˜es Finais
co
MultiAdapter
33. Grok - mais um framework web Programando com o Grok M´dulos externos
o Considera¸˜es Finais
co
34. Grok - mais um framework web Programando com o Grok M´dulos externos
o Considera¸˜es Finais
co
Definindo a Seguran¸a
c
import grok
class UmaPermissao(grok.Permission):
grok.name("example.register")
class VerHome(grok.Permission):
grok.name("example.homeaccess")
35. Grok - mais um framework web Programando com o Grok M´dulos externos
o Considera¸˜es Finais
co
Definindo a Seguran¸a
c
import grok
from permissions import VerHome, UmaPermissao
class Membro(grok.Role):
grok.name("example.Membro")
grok.permissions( ’example.ViewHome’, ’example.register’,)
# grok.permissions( ViewHome, UmaPermissao,)
36. Grok - mais um framework web Programando com o Grok M´dulos externos
o Considera¸˜es Finais
co
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import grok
import permissions
class Example(grok.Application, grok.Container):
pass
class Segredo(grok.View):
grok.require("example.homeaccess")
def render(self,**kwargs):
return """<html>
<body>
<img src="" tal:attributes="static/malandro.jpg"/>
</body>
</html>
"""
class Index(grok.View):
grok.require(permissions.VerHome)
@grok.require("example.register")
def available_users(self):
return u"Greetings Stranger!"
37. Grok - mais um framework web Programando com o Grok M´dulos externos
o Considera¸˜es Finais
co
Conectando a DB Relacional
Existem dois mecanismos para utilizar mapeamento
objeto relacional transparente com o Grok: o
megrok.rdb e o stormcontainer. O primeiro ´ uma
e
camada que segue o conjunto de opera¸˜es do
co
objetos Grok s´ que ao inv´s de Armazenar os
o e
dados no ZODB. ele usa o SQlAlchemy para efetuar
o mapeamento. O nva.stormcontainer utiliza um
outro mecanismo de .
• megrok.rdb
• nva.stormcontainer
38. Grok - mais um framework web Programando com o Grok M´dulos externos
o Considera¸˜es Finais
co
Definindo as classes o megrok.rdb
import grok
from sqlalchemy import Column, ForeignKey
from sqlalchemy.types import Integer, String
from sqlalchemy.orm import relation
from megrok import rdb
from z3c.saconfig import EngineFactory, GloballyScopedSession
from z3c.saconfig.interfaces import (IEngineFactory, IScopedSession,
IEngineCreatedEvent)
TEST_DSN = ’sqlite:///:memory:’
metadata = rdb.MetaData()
engine_factory = EngineFactory(TEST_DSN)
scoped_session = GloballyScopedSession()
grok.global_utility(engine_factory, provides=IEngineFactory, direct=True)
grok.global_utility(scoped_session, provides=IScopedSession, direct=True)
class Example(grok.Application, grok.Container):
pass
class Index(grok.View):
grok.context(Example)
pass # see app_templates/index.pt
class Cursos(rdb.Container):
pass
class Departamento(rdb.Model):
rdb.metadata(metadata)
39. Grok - mais um framework web Programando com o Grok M´dulos externos
o Considera¸˜es Finais
co
Criando as classes de mapeamento
:Test-Layer: functional
>>> from example.app import Example
>>> from megrok import rdb
>>> root = getRootFolder()
>>> root[’app’] = Example()
>>> from example.app import Curso, Departamento
>>> session = rdb.Session()
>>> filosofia = Departamento(nome="Filosofia")
>>> session.add(filosofia)
>>> logica = Curso(nome="L´gica")
o
>>> etica = Curso(nome="´tica")
E
>>> metafisica = Curso(nome="Metaf´sica")
ı
>>> session.add_all([logica, etica, metafisica])
>>> filosofia.cursos.set(logica)
>>> filosofia.cursos.set(etica)
>>> filosofia.cursos.set(metafisica)
>>> for key, value in sorted(filosofia.cursos.items()):
... print key, value.nome, value.departmento.nome
1 L´gica Filosofia
o
´
2 Etica Filosofia
3 Metaf´sica Filosofia
ı
40. Grok - mais um framework web Programando com o Grok M´dulos externos
o Considera¸˜es Finais
co
Definindo as classes usando o
nva.stormcontainer
import grok
from nva.stormcontainer import StormContainer
from storm.locals import Storm, Int, Unicode, Reference
class Example(grok.Application, grok.Container):
pass
class Grupo(StormContainer, grok.Container):
def __init__(self):
super(Grupo,self).__init__()
self.setClassName(’example.app.Pessoa’)
self.setStoreUtilityName(’test’)
class Compania(StormContainer, grok.Container):
def __init__(self):
super(Compania,self).__init__()
self.setClassName(’example.app.Departamento’)
self.setStoreUtilityName(’test’)
class Departamento(grok.Model,Storm):
__storm_table__ = "departamento"
id_departamento = Int(primary=True)
nome = Unicode()
class Pessoa(grok.Model,Storm):
__storm_table__ = "pessoa"
41. Grok - mais um framework web Programando com o Grok M´dulos externos
o Considera¸˜es Finais
co
Do a functional doctest test on the app.
========================================
:Test-Layer: functional
Let’s first create an instance of Example at the top level:
>>> from example.app import Example,Grupo, Compania, Pessoa, Departamento
>>> root = getRootFolder()
>>> root[’app’] = app = Example()
>>> app[’pessoas’] = pessoas = Grupo()
>>> app[’departamentos’] = iff = Compania()
>>> print iff.id, pessoas.id
None, None
>>> import transaction
>>> transaction.commit()
>>> print iff.id, pessoas.id
None, None
>>> nsi = Departamento()
>>> nsi.nome = "N´cleo de Pesquisa em Sistemas de Informa¸ao"
u c~
>>> iff[’id’] = Com
>>> app[’departamentos’]
>>> pessoa = Pessoa()
>>> pessoa.nome = "Diego"
>>>
42. Grok - mais um framework web Programando com o Grok M´dulos externos
o Considera¸˜es Finais
co
Usando o megrok.login
Permite definir rapidamente um sistema de usu´rio
a
e p´ginas de login e logout.
a
43. Grok - mais um framework web Programando com o Grok M´dulos externos
o Considera¸˜es Finais
co
Usando o megrok.strictrequire
For¸a a defini¸˜o de seguran¸a para todas as Views.
c ca c
Procedimentos simples de uso : Inclua como
dependˆncia.
e
44. Grok - mais um framework web Programando com o Grok M´dulos externos
o Considera¸˜es Finais
co
Outros m´dulos
o
• megrok.navigation - Permite criar menus e
associ´-los com classes Views.
a
• megrok.jinja - Usar a sintaxe Jinja para a
cria¸˜o de modelos de p´ginas.
ca a
• megrok.genshi - Usar a sintaxe Genshi para a
cria¸˜o de modelos de p´ginas.
ca a
• megrok.z3ctable - Permite criar tabula¸oes em
c˜
html facilmente a partir de item de containers.
• megrok.traject - Permite criar mecanismo f´cil
a
de ”atravessamento”de URLS.
• megrok.chameleon - Permite aumentar a
performance dos modelos de p´ginas.
a
45. Grok - mais um framework web Programando com o Grok M´dulos externos
o Considera¸˜es Finais
co
Conclus˜es
o
• Possui uma gama gigante de componentes.
• Agora ´ poss´
e ıvel fazer coisas simples.
• OO rulez!
• Flexibilidade infinita.
46. Grok - mais um framework web Programando com o Grok M´dulos externos
o Considera¸˜es Finais
co
Documenta¸˜o
ca
• http://grok.zope.org
• http://github.com/dmpinheiro/Tutorial-Grok-
pt-br
• http://apidoc.zope.org
• http://wiki.zope.org/zope3/book.pdf
• http://nsi.iff.edu.br/dicas-e-tutoriais/zca
47. Grok - mais um framework web Programando com o Grok M´dulos externos
o Considera¸˜es Finais
co
Livros
48. Grok - mais um framework web Programando com o Grok M´dulos externos
o Considera¸˜es Finais
co
Enrique¸a sua cultura in´til: a origem da
c u
palavra grok
A palavra grok vem do livro strange in strange land
por robert a. heinlein.
Referˆncia : http://en.wikipedia.org/wiki/grok
e
49. Grok - mais um framework web Programando com o Grok M´dulos externos
o Considera¸˜es Finais
co
Obrigado!!!
• me@dmpinheiro.net
• github.com/dmpinheiro
• slideshare.com/dmpinheiro
• launchpad.net/dmpinheiro