Grok!

1,010 views

Published on

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

  • Be the first to like this

No Downloads
Views
Total views
1,010
On SlideShare
0
From Embeds
0
Number of Embeds
6
Actions
Shares
0
Downloads
9
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Grok!

  1. 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. 2. Grok - mais um framework web Programando com o Grok M´dulos externos o Considera¸˜es Finais co
  3. 3. Grok - mais um framework web Programando com o Grok M´dulos externos o Considera¸˜es Finais co ZODB
  4. 4. Grok - mais um framework web Programando com o Grok M´dulos externos o Considera¸˜es Finais co
  5. 5. Grok - mais um framework web Programando com o Grok M´dulos externos o Considera¸˜es Finais co Componentes
  6. 6. Grok - mais um framework web Programando com o Grok M´dulos externos o Considera¸˜es Finais co
  7. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 32. Grok - mais um framework web Programando com o Grok M´dulos externos o Considera¸˜es Finais co MultiAdapter
  33. 33. Grok - mais um framework web Programando com o Grok M´dulos externos o Considera¸˜es Finais co
  34. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 47. Grok - mais um framework web Programando com o Grok M´dulos externos o Considera¸˜es Finais co Livros
  48. 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. 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

×