SlideShare una empresa de Scribd logo
1 de 33
Descargar para leer sin conexión
Reusando componentes Zope fuera de Zope
(y la web)
Roberto Allende
Menttes / Plone Foundation
rallende@menttes.com
http://robertoallende.com
twitter: robertoallende
 Buildout
 ZODB
 Zope Page Templates
 Adaptadores
Buildout is a Python-based build system for
creating, assembling and deploying applications
from multiple parts, some of which may be non-
Python-based. It lets you create a buildout
configuration and reproduce the same software
later.
Buildout
Tool for working with eggs
Repeatable
Developer oriented
Buildout | Features
$ easy_install zc.buildout
Buildout | Install
$ svn co http://miproyecto
$ python bootstrap.py
$ bin/buildout -v
…
$ bin/miproyecto.py
Buildout | Deploy con buildout
project/
bootstrap.py
buildout.cfg
.installed.cfg
parts/
develop-eggs/
bin/
buildout
miproyecto
eggs/
downloads/
Buildout | Deploy con buildout
[buildout]
index-url = http://pypi.it.uwosh.edu/
parts = instance
zopepy
eggdeps
degraph
extends = http://download.zope.org/Zope2/index/2.13.0a3/versions.cfg
eggs = tl.eggdeps
[instance]
recipe = plone.recipe.zope2instance
user = admin:admin
http-address = 8080
products = ${buildout:directory}/products
Buildout | buildout.cfg
http://buildout.org
Buildout | Mas información
Don’t squeeze your objects into tables:
store them in an object database.
ZODB
Transparent persistence for Python objects
Full ACID-compatible transaction support
History/undo ability
Efficient support for binary large objects (BLOBs)
Pluggable storages
Scalable architecture
ZODB | Features
$ easy_install ZODB3$ easy_install ZODB3
……
$ python$ python
>>> import ZODB>>> import ZODB
ZODB | Instalación
>>> from ZODB.FileStorage import FileStorage>>> from ZODB.FileStorage import FileStorage
>>> from ZODB.DB import DB>>> from ZODB.DB import DB
>>> storage = FileStorage('Data.fs')>>> storage = FileStorage('Data.fs')
>>> db = DB(storage)>>> db = DB(storage)
>>> connection = db.open()>>> connection = db.open()
>>> root = connection.root()>>> root = connection.root()
ZODB | Configuración
>>> root['account-1'] = Account()>>> root['account-1'] = Account()
>>> root['account-2'] = Account()>>> root['account-2'] = Account()
ZODB | Haciendo un objeto persistente
>>> import transaction>>> import transaction
>>> transaction.commit()>>> transaction.commit()
>>> root.keys()>>> root.keys()
['account-1', 'account-2']['account-1', 'account-2']
ZODB | Transactions
http://zodb.orghttp://zodb.org
ZODB | Mas Lectura
Zope Page Template allows you to generateZope Page Template allows you to generate
HTML dynamically.HTML dynamically.
Chameleon compiles templates to Python byte-code. It includes aChameleon compiles templates to Python byte-code. It includes a
complete implementation of the Zope Page Templates (ZPT) language andcomplete implementation of the Zope Page Templates (ZPT) language and
a partial implementation of the Genshi language.a partial implementation of the Genshi language.
ZPT vía Chameleon
ZPT templates are valid XML documentsZPT templates are valid XML documents
It uses namespaces for attributes and tags toIt uses namespaces for attributes and tags to
define the template behaviour.define the template behaviour.
Works on Python 2.4, 2.5 and 2.6, includingWorks on Python 2.4, 2.5 and 2.6, including
Google App EngineGoogle App Engine
PHP, Java, PerlPHP, Java, Perl
ZPT vía Chameleon
$ easy_install Chameleon$ easy_install Chameleon
ZPT vía Chameleon | Install
<table border="1"><table border="1">
<tr<tr tal:repeat="row range(10)"tal:repeat="row range(10)">>
<td<td tal:repeat="column range(10)"tal:repeat="column range(10)">>
<span<span tal:define="x repeat.row.number;tal:define="x repeat.row.number;
y repeat.column.number;y repeat.column.number;
z x * y"z x * y"
tal:replace="string:$x * $y = $z"tal:replace="string:$x * $y = $z">1 * 1 =>1 * 1 =
</span></span>
</td></td>
</tr></tr>
</table></table>
ZPT vía Chameleon | Template loader
from chameleon.zpt import loaderfrom chameleon.zpt import loader
template_path = os.path.join(os.path.dirname(__file__), "..", "templates")template_path = os.path.join(os.path.dirname(__file__), "..", "templates")
template_loader = loader.TemplateLoader(template_path,template_loader = loader.TemplateLoader(template_path,
auto_reload=os.environ['SERVER_SOFTWARE'].startswith('Dev'))auto_reload=os.environ['SERVER_SOFTWARE'].startswith('Dev'))
ZPT vía Chameleon | Ejemplo
def TestHandler(RequestHandler):def TestHandler(RequestHandler):
def get(self):def get(self):
template = template_loader.load("test.pt")template = template_loader.load("test.pt")
self.response.body = template(name="test")self.response.body = template(name="test")
ZPT vía Chameleon | Ejemplo
http://chameleon.repoze.orghttp://chameleon.repoze.org
http://blog.notdot.nethttp://blog.notdot.net
Webapps on App Engine, part 4: TemplatingWebapps on App Engine, part 4: Templating
ZPT vía Chameleon | Mas Lectura
Dynamic adaptation might feel like a typeDynamic adaptation might feel like a type
declaration, but it's not!declaration, but it's not!
It specifies a behavior, not a type; it's dynamic;It specifies a behavior, not a type; it's dynamic;
it's optional.it's optional.
Adapters
class File(object):class File(object):
body = 'foo bar'body = 'foo bar'
class FileSize(object):class FileSize(object):
def __init__(self, context):def __init__(self, context):
self.context = contextself.context = context
def getSize(self):def getSize(self):
return len(self.context.body)return len(self.context.body)
tamano = FileSize(File())tamano = FileSize(File())
print client.request()print client.request()
Adapters | Wrapper
Intrusivo clase baseIntrusivo clase base
Test aisladamenteTest aisladamente
Control factoryControl factory
Colision de nombresColision de nombres
Patches compitenPatches compiten
Lo hace RubyLo hace Ruby
Wrapping es molestoWrapping es molesto
Zope es Cool!Zope es Cool!
Adapters | Comparación con Otros
por Brandon Craig Rhodes
Herencia
oo
xx
xx
xx
Mixin
oo
oo
xx
xx
MonkeyPatch
oo
xx
xx
xx
Adapter
oo
oo
oo
oo
xx
oo
oo
oo
oo
oo
oo
Adapter
a'la Zope
1. Define an interface1. Define an interface
2. Register our adapter2. Register our adapter
3. Request adaptation3. Request adaptation
Adapters | 1, 2, 3
$ easy_install zope.interface$ easy_install zope.interface
$ easy_install zope.component$ easy_install zope.component
Adapters | Install
import zope.interfaceimport zope.interface
class IFile(zope.interface.Interface):class IFile(zope.interface.Interface):
body = zope.interface.Attribute('Contents of the file.')body = zope.interface.Attribute('Contents of the file.')
class ISize(zope.interface.Interface):class ISize(zope.interface.Interface):
def getSize():def getSize():
'Return the size of an object.''Return the size of an object.'
Adapters | Define an interface
from zope.interface.adapter import AdapterRegistryfrom zope.interface.adapter import AdapterRegistry
registry = AdapterRegistry()registry = AdapterRegistry()
registry.register([IFile], ISize, '', FileSize)registry.register([IFile], ISize, '', FileSize)
Adapters | Register our adapterRegister our adapter
>>>>>> def hook(provided, object):def hook(provided, object):
>>>>>> adapter = registry.lookup1(zope.interface.providedBy(object),adapter = registry.lookup1(zope.interface.providedBy(object),
>>>>>> provided, '')provided, '')
>>>>>> return adapter(object)return adapter(object)
>>>>>> from zope.interface.interface import adapter_hooksfrom zope.interface.interface import adapter_hooks
>>>>>> adapter_hooks.append(hook)adapter_hooks.append(hook)
>>> size = ISize(file)>>> size = ISize(file)
>>> size.getSize()>>> size.getSize()
77
Adapters | Request adaptationRequest adaptation
Using the Adapter RegistryUsing the Adapter Registry
http://docs.zope.org/zope3/Book/ifaceschema/human/show.htmlhttp://docs.zope.org/zope3/Book/ifaceschema/human/show.html
Using Grok to walk like a DuckUsing Grok to walk like a Duck
Brandon Rhodes - Pycon08, PloneConf 08Brandon Rhodes - Pycon08, PloneConf 08
Adapters | Mas Lectura
Muchas Gracias
Roberto Allende
http://robertoallende.com
Twitter: robertoallende
rallende@menttes.com

Más contenido relacionado

La actualidad más candente

Introducing Command Line Applications with Ruby
Introducing Command Line Applications with RubyIntroducing Command Line Applications with Ruby
Introducing Command Line Applications with Ruby
Nikhil Mungel
 
Spl in the wild - zendcon2012
Spl in the wild - zendcon2012Spl in the wild - zendcon2012
Spl in the wild - zendcon2012
Elizabeth Smith
 

La actualidad más candente (20)

Can you upgrade to Puppet 4.x? (Beginner) Can you upgrade to Puppet 4.x? (Beg...
Can you upgrade to Puppet 4.x? (Beginner) Can you upgrade to Puppet 4.x? (Beg...Can you upgrade to Puppet 4.x? (Beginner) Can you upgrade to Puppet 4.x? (Beg...
Can you upgrade to Puppet 4.x? (Beginner) Can you upgrade to Puppet 4.x? (Beg...
 
Introducing Command Line Applications with Ruby
Introducing Command Line Applications with RubyIntroducing Command Line Applications with Ruby
Introducing Command Line Applications with Ruby
 
Asynchronous Systems with Fn Flow
Asynchronous Systems with Fn FlowAsynchronous Systems with Fn Flow
Asynchronous Systems with Fn Flow
 
Spl in the wild - zendcon2012
Spl in the wild - zendcon2012Spl in the wild - zendcon2012
Spl in the wild - zendcon2012
 
Power of Puppet 4
Power of Puppet 4Power of Puppet 4
Power of Puppet 4
 
Basics of ANT
Basics of ANTBasics of ANT
Basics of ANT
 
C++ for Java Developers (JavaZone 2017)
C++ for Java Developers (JavaZone 2017)C++ for Java Developers (JavaZone 2017)
C++ for Java Developers (JavaZone 2017)
 
Learning Python from Data
Learning Python from DataLearning Python from Data
Learning Python from Data
 
Using spl tools in your code
Using spl tools in your codeUsing spl tools in your code
Using spl tools in your code
 
Object Trampoline: Why having not the object you want is what you need.
Object Trampoline: Why having not the object you want is what you need.Object Trampoline: Why having not the object you want is what you need.
Object Trampoline: Why having not the object you want is what you need.
 
Keep your repo clean
Keep your repo cleanKeep your repo clean
Keep your repo clean
 
C++ for Java Developers (SwedenCpp Meetup 2017)
C++ for Java Developers (SwedenCpp Meetup 2017)C++ for Java Developers (SwedenCpp Meetup 2017)
C++ for Java Developers (SwedenCpp Meetup 2017)
 
Perl Tidy Perl Critic
Perl Tidy Perl CriticPerl Tidy Perl Critic
Perl Tidy Perl Critic
 
Doing It Wrong with Puppet -
Doing It Wrong with Puppet - Doing It Wrong with Puppet -
Doing It Wrong with Puppet -
 
Java Full Throttle
Java Full ThrottleJava Full Throttle
Java Full Throttle
 
Php extensions
Php extensionsPhp extensions
Php extensions
 
Zend expressive workshop
Zend expressive workshopZend expressive workshop
Zend expressive workshop
 
나도 할 수 있다 오픈소스
나도 할 수 있다 오픈소스나도 할 수 있다 오픈소스
나도 할 수 있다 오픈소스
 
Composer - Package Management for PHP. Silver Bullet?
Composer - Package Management for PHP. Silver Bullet?Composer - Package Management for PHP. Silver Bullet?
Composer - Package Management for PHP. Silver Bullet?
 
Bash in theory and in practice - part two
Bash in theory and in practice - part twoBash in theory and in practice - part two
Bash in theory and in practice - part two
 

Destacado

Destacado (8)

1001 formas de promover Python
1001 formas de promover Python1001 formas de promover Python
1001 formas de promover Python
 
Plone 3 Products Development Cookbook
Plone 3 Products Development CookbookPlone 3 Products Development Cookbook
Plone 3 Products Development Cookbook
 
From copy to paster: A middle-class Plone developer tale
From copy to paster: A middle-class Plone developer taleFrom copy to paster: A middle-class Plone developer tale
From copy to paster: A middle-class Plone developer tale
 
Plone 4 — what's up doc?
Plone 4 — what's up doc?Plone 4 — what's up doc?
Plone 4 — what's up doc?
 
CMS + CRM: Integrando Plone y Salesforce
CMS + CRM: Integrando Plone y SalesforceCMS + CRM: Integrando Plone y Salesforce
CMS + CRM: Integrando Plone y Salesforce
 
Construindo uma Intranet Corporativa utilizando Plone
Construindo uma Intranet Corporativa utilizando PloneConstruindo uma Intranet Corporativa utilizando Plone
Construindo uma Intranet Corporativa utilizando Plone
 
El estado de Plone
El estado de PloneEl estado de Plone
El estado de Plone
 
Management para emprendimientos: Lean Startup
Management para emprendimientos: Lean Startup Management para emprendimientos: Lean Startup
Management para emprendimientos: Lean Startup
 

Similar a Reusando componentes Zope fuera de Zope

Rifartek Robot Training Course - How to use ClientRobot
Rifartek Robot Training Course - How to use ClientRobotRifartek Robot Training Course - How to use ClientRobot
Rifartek Robot Training Course - How to use ClientRobot
Tsai Tsung-Yi
 
Making the most of your Test Suite
Making the most of your Test SuiteMaking the most of your Test Suite
Making the most of your Test Suite
ericholscher
 
ZopeSkel & Buildout packages
ZopeSkel & Buildout packagesZopeSkel & Buildout packages
ZopeSkel & Buildout packages
Quintagroup
 

Similar a Reusando componentes Zope fuera de Zope (20)

Django on Jython, PyCon 2009
Django on Jython, PyCon 2009Django on Jython, PyCon 2009
Django on Jython, PyCon 2009
 
A Fabric/Puppet Build/Deploy System
A Fabric/Puppet Build/Deploy SystemA Fabric/Puppet Build/Deploy System
A Fabric/Puppet Build/Deploy System
 
Bangpypers april-meetup-2012
Bangpypers april-meetup-2012Bangpypers april-meetup-2012
Bangpypers april-meetup-2012
 
Building Content Types with Dexterity
Building Content Types with DexterityBuilding Content Types with Dexterity
Building Content Types with Dexterity
 
Rifartek Robot Training Course - How to use ClientRobot
Rifartek Robot Training Course - How to use ClientRobotRifartek Robot Training Course - How to use ClientRobot
Rifartek Robot Training Course - How to use ClientRobot
 
Making the most of your Test Suite
Making the most of your Test SuiteMaking the most of your Test Suite
Making the most of your Test Suite
 
All the Laravel things: up and running to making $$
All the Laravel things: up and running to making $$All the Laravel things: up and running to making $$
All the Laravel things: up and running to making $$
 
Building JBoss AS 7 for Fedora
Building JBoss AS 7 for FedoraBuilding JBoss AS 7 for Fedora
Building JBoss AS 7 for Fedora
 
Living With Legacy Code
Living With Legacy CodeLiving With Legacy Code
Living With Legacy Code
 
JavaScript Miller Columns
JavaScript Miller ColumnsJavaScript Miller Columns
JavaScript Miller Columns
 
ZopeSkel & Buildout packages
ZopeSkel & Buildout packagesZopeSkel & Buildout packages
ZopeSkel & Buildout packages
 
Rails 101
Rails 101Rails 101
Rails 101
 
Selenium & PHPUnit made easy with Steward (Berlin, April 2017)
Selenium & PHPUnit made easy with Steward (Berlin, April 2017)Selenium & PHPUnit made easy with Steward (Berlin, April 2017)
Selenium & PHPUnit made easy with Steward (Berlin, April 2017)
 
Introduction to PowerShell
Introduction to PowerShellIntroduction to PowerShell
Introduction to PowerShell
 
Simplify your professional web development with symfony
Simplify your professional web development with symfonySimplify your professional web development with symfony
Simplify your professional web development with symfony
 
SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later
SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years laterSymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later
SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later
 
Acceptance testing plone sites and add ons with robot framework and selenium
Acceptance testing plone sites and add ons with robot framework and seleniumAcceptance testing plone sites and add ons with robot framework and selenium
Acceptance testing plone sites and add ons with robot framework and selenium
 
CollabSphere 2021 - DEV114 - The Nuts and Bolts of CI/CD With a Large XPages ...
CollabSphere 2021 - DEV114 - The Nuts and Bolts of CI/CD With a Large XPages ...CollabSphere 2021 - DEV114 - The Nuts and Bolts of CI/CD With a Large XPages ...
CollabSphere 2021 - DEV114 - The Nuts and Bolts of CI/CD With a Large XPages ...
 
Writing your Third Plugin
Writing your Third PluginWriting your Third Plugin
Writing your Third Plugin
 
Django dev-env-my-way
Django dev-env-my-wayDjango dev-env-my-way
Django dev-env-my-way
 

Más de menttes

Más de menttes (6)

Qué puede aprender Drupal de Plone
Qué puede aprender Drupal de PloneQué puede aprender Drupal de Plone
Qué puede aprender Drupal de Plone
 
Integrando Plone con cualquier cosa
Integrando Plone con cualquier cosaIntegrando Plone con cualquier cosa
Integrando Plone con cualquier cosa
 
Menttes: 5 años emprendiendo con Software Libre
Menttes: 5 años emprendiendo con Software LibreMenttes: 5 años emprendiendo con Software Libre
Menttes: 5 años emprendiendo con Software Libre
 
Intranets flexibles y escalables con Plone
Intranets flexibles y escalables con PloneIntranets flexibles y escalables con Plone
Intranets flexibles y escalables con Plone
 
Combinación ganadora: Plone como CMS, tu framework preferido como frontend
Combinación ganadora: Plone como CMS, tu framework preferido como frontendCombinación ganadora: Plone como CMS, tu framework preferido como frontend
Combinación ganadora: Plone como CMS, tu framework preferido como frontend
 
No me hagas pensar. Buenas Prácticas para desarrollar en la web
No me hagas pensar. Buenas Prácticas para desarrollar en la webNo me hagas pensar. Buenas Prácticas para desarrollar en la web
No me hagas pensar. Buenas Prácticas para desarrollar en la web
 

Último

Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Victor Rentea
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Victor Rentea
 

Último (20)

Spring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUKSpring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 
AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024
 
CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistan
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 

Reusando componentes Zope fuera de Zope

  • 1. Reusando componentes Zope fuera de Zope (y la web) Roberto Allende Menttes / Plone Foundation rallende@menttes.com http://robertoallende.com twitter: robertoallende
  • 2.  Buildout  ZODB  Zope Page Templates  Adaptadores
  • 3. Buildout is a Python-based build system for creating, assembling and deploying applications from multiple parts, some of which may be non- Python-based. It lets you create a buildout configuration and reproduce the same software later. Buildout
  • 4. Tool for working with eggs Repeatable Developer oriented Buildout | Features
  • 6. $ svn co http://miproyecto $ python bootstrap.py $ bin/buildout -v … $ bin/miproyecto.py Buildout | Deploy con buildout
  • 8. [buildout] index-url = http://pypi.it.uwosh.edu/ parts = instance zopepy eggdeps degraph extends = http://download.zope.org/Zope2/index/2.13.0a3/versions.cfg eggs = tl.eggdeps [instance] recipe = plone.recipe.zope2instance user = admin:admin http-address = 8080 products = ${buildout:directory}/products Buildout | buildout.cfg
  • 10. Don’t squeeze your objects into tables: store them in an object database. ZODB
  • 11. Transparent persistence for Python objects Full ACID-compatible transaction support History/undo ability Efficient support for binary large objects (BLOBs) Pluggable storages Scalable architecture ZODB | Features
  • 12. $ easy_install ZODB3$ easy_install ZODB3 …… $ python$ python >>> import ZODB>>> import ZODB ZODB | Instalación
  • 13. >>> from ZODB.FileStorage import FileStorage>>> from ZODB.FileStorage import FileStorage >>> from ZODB.DB import DB>>> from ZODB.DB import DB >>> storage = FileStorage('Data.fs')>>> storage = FileStorage('Data.fs') >>> db = DB(storage)>>> db = DB(storage) >>> connection = db.open()>>> connection = db.open() >>> root = connection.root()>>> root = connection.root() ZODB | Configuración
  • 14. >>> root['account-1'] = Account()>>> root['account-1'] = Account() >>> root['account-2'] = Account()>>> root['account-2'] = Account() ZODB | Haciendo un objeto persistente
  • 15. >>> import transaction>>> import transaction >>> transaction.commit()>>> transaction.commit() >>> root.keys()>>> root.keys() ['account-1', 'account-2']['account-1', 'account-2'] ZODB | Transactions
  • 17. Zope Page Template allows you to generateZope Page Template allows you to generate HTML dynamically.HTML dynamically. Chameleon compiles templates to Python byte-code. It includes aChameleon compiles templates to Python byte-code. It includes a complete implementation of the Zope Page Templates (ZPT) language andcomplete implementation of the Zope Page Templates (ZPT) language and a partial implementation of the Genshi language.a partial implementation of the Genshi language. ZPT vía Chameleon
  • 18. ZPT templates are valid XML documentsZPT templates are valid XML documents It uses namespaces for attributes and tags toIt uses namespaces for attributes and tags to define the template behaviour.define the template behaviour. Works on Python 2.4, 2.5 and 2.6, includingWorks on Python 2.4, 2.5 and 2.6, including Google App EngineGoogle App Engine PHP, Java, PerlPHP, Java, Perl ZPT vía Chameleon
  • 19. $ easy_install Chameleon$ easy_install Chameleon ZPT vía Chameleon | Install
  • 20. <table border="1"><table border="1"> <tr<tr tal:repeat="row range(10)"tal:repeat="row range(10)">> <td<td tal:repeat="column range(10)"tal:repeat="column range(10)">> <span<span tal:define="x repeat.row.number;tal:define="x repeat.row.number; y repeat.column.number;y repeat.column.number; z x * y"z x * y" tal:replace="string:$x * $y = $z"tal:replace="string:$x * $y = $z">1 * 1 =>1 * 1 = </span></span> </td></td> </tr></tr> </table></table> ZPT vía Chameleon | Template loader
  • 21. from chameleon.zpt import loaderfrom chameleon.zpt import loader template_path = os.path.join(os.path.dirname(__file__), "..", "templates")template_path = os.path.join(os.path.dirname(__file__), "..", "templates") template_loader = loader.TemplateLoader(template_path,template_loader = loader.TemplateLoader(template_path, auto_reload=os.environ['SERVER_SOFTWARE'].startswith('Dev'))auto_reload=os.environ['SERVER_SOFTWARE'].startswith('Dev')) ZPT vía Chameleon | Ejemplo
  • 22. def TestHandler(RequestHandler):def TestHandler(RequestHandler): def get(self):def get(self): template = template_loader.load("test.pt")template = template_loader.load("test.pt") self.response.body = template(name="test")self.response.body = template(name="test") ZPT vía Chameleon | Ejemplo
  • 23. http://chameleon.repoze.orghttp://chameleon.repoze.org http://blog.notdot.nethttp://blog.notdot.net Webapps on App Engine, part 4: TemplatingWebapps on App Engine, part 4: Templating ZPT vía Chameleon | Mas Lectura
  • 24. Dynamic adaptation might feel like a typeDynamic adaptation might feel like a type declaration, but it's not!declaration, but it's not! It specifies a behavior, not a type; it's dynamic;It specifies a behavior, not a type; it's dynamic; it's optional.it's optional. Adapters
  • 25. class File(object):class File(object): body = 'foo bar'body = 'foo bar' class FileSize(object):class FileSize(object): def __init__(self, context):def __init__(self, context): self.context = contextself.context = context def getSize(self):def getSize(self): return len(self.context.body)return len(self.context.body) tamano = FileSize(File())tamano = FileSize(File()) print client.request()print client.request() Adapters | Wrapper
  • 26. Intrusivo clase baseIntrusivo clase base Test aisladamenteTest aisladamente Control factoryControl factory Colision de nombresColision de nombres Patches compitenPatches compiten Lo hace RubyLo hace Ruby Wrapping es molestoWrapping es molesto Zope es Cool!Zope es Cool! Adapters | Comparación con Otros por Brandon Craig Rhodes Herencia oo xx xx xx Mixin oo oo xx xx MonkeyPatch oo xx xx xx Adapter oo oo oo oo xx oo oo oo oo oo oo Adapter a'la Zope
  • 27. 1. Define an interface1. Define an interface 2. Register our adapter2. Register our adapter 3. Request adaptation3. Request adaptation Adapters | 1, 2, 3
  • 28. $ easy_install zope.interface$ easy_install zope.interface $ easy_install zope.component$ easy_install zope.component Adapters | Install
  • 29. import zope.interfaceimport zope.interface class IFile(zope.interface.Interface):class IFile(zope.interface.Interface): body = zope.interface.Attribute('Contents of the file.')body = zope.interface.Attribute('Contents of the file.') class ISize(zope.interface.Interface):class ISize(zope.interface.Interface): def getSize():def getSize(): 'Return the size of an object.''Return the size of an object.' Adapters | Define an interface
  • 30. from zope.interface.adapter import AdapterRegistryfrom zope.interface.adapter import AdapterRegistry registry = AdapterRegistry()registry = AdapterRegistry() registry.register([IFile], ISize, '', FileSize)registry.register([IFile], ISize, '', FileSize) Adapters | Register our adapterRegister our adapter
  • 31. >>>>>> def hook(provided, object):def hook(provided, object): >>>>>> adapter = registry.lookup1(zope.interface.providedBy(object),adapter = registry.lookup1(zope.interface.providedBy(object), >>>>>> provided, '')provided, '') >>>>>> return adapter(object)return adapter(object) >>>>>> from zope.interface.interface import adapter_hooksfrom zope.interface.interface import adapter_hooks >>>>>> adapter_hooks.append(hook)adapter_hooks.append(hook) >>> size = ISize(file)>>> size = ISize(file) >>> size.getSize()>>> size.getSize() 77 Adapters | Request adaptationRequest adaptation
  • 32. Using the Adapter RegistryUsing the Adapter Registry http://docs.zope.org/zope3/Book/ifaceschema/human/show.htmlhttp://docs.zope.org/zope3/Book/ifaceschema/human/show.html Using Grok to walk like a DuckUsing Grok to walk like a Duck Brandon Rhodes - Pycon08, PloneConf 08Brandon Rhodes - Pycon08, PloneConf 08 Adapters | Mas Lectura