The goodies that
Zope begat
Pyramid, Plone, buildout + more
Dylan Jay @djay75
Who am I?
Dylan Jay
Core Plone Contributor
1995 First web app (ISAPI)
1999 Built first e-commerce
site (zope)
2003 Built f...
Reasons for this talk
History
"Those who don't learn from history are
doomed to add it as a feature of their
framework"
Be...
The goodies
1. Traversal
2. ZODB
3. ZTK Adapters
4. Sprints
5. Pyramid
6. Buildout
7. Plone + the customisation cliff
8. D...
Python family tree(web)
Zope (1996-)
ZTK (BlueBream)
(2004-)
Pylons/TurboGears
(2005-2010)Django (2005-)
Flask (2010-)
RoR...
Zope - wtf was that about?
Back in 1996
● webserver = path to file
● cgi = path to script + args
● OO - was very big
● Jim...
Goodie #1 - Traversal
response = traverse(root, HTTP_PATH.split('/'), request)
def traverse(context, path, request):
if le...
Traversal - why?
Good for CMS
plugins cooperating
webapps
complex apps
TraversalRoutes
/A/B/C/myaction/myaction/id123
dist...
Goodie #2: ZODB
● Want to store something non relational?
● Want to store something non key-value?
● Got complex object st...
ZODB: The piss easy DB
$ easyinstall ZODB
db = DB( FileStorage.FileStorage('./Data.fs') )
connection = db.open()
dbroot = ...
ZODB: simple but powerful
● transactions - multiversion concurrency
control (MVCC)
● scalability across a network (using Z...
Goodie #3: Adapters
Adapters: why?
● Solves how to plug complex software
together
● Better than Object Orientation
● Perfect for overridable s...
ZTK Adapters
class IUSPlug(zope.interface):
prongs = Attribute("""number of prongs""")
class Motox(object):
implements(IUS...
ZTK Adapters
class ACPowerAdapter(object):
implements(INZPlug)
adapts(IUSPlug)
def __init__(self, plug):
self.prongs = plu...
ZTK Adapters
>>> myphone = MotoX()
>>> myphone.prongs == 3
False
>>> adaptedphone = INZPlug(myphone)
>>> adaptedphone.pron...
Goodie #4: Sprints
“The practice of using sprints for open source
software development was pioneered by the
Zope Corporati...
Goodie #5 Pyramid
Zope (1996-)
ZTK (BlueBream)
(2004-)
Pylons/TurboGears
(2005-2010)Django (2005-)
Flask (2010-)
RoR (2004...
Pyramid: It's micro!
from wsgiref.simple_server import make_server
from pyramid.view import view_config
from pyramid.confi...
Pyramid: worst name ever
Pyramid (the structure) Pyramid (the framework)
Start big - End small Start small - End big
Ancie...
Pyramid: a "micro & more"
Framework
● a declarative authorization system
● extensibility: aggregate Pyramid application
co...
Pyramid: routes vs.
traversal: why not both?
from wsgiref.simple_server import make_server
from pyramid.config import Conf...
Goodie #6: buildout
buildout - what you get if you put make, puppet,
python, pip, virtualenv into a blender
Buildout
● uses recipes - python packages that know
how to build other things
○ like puppet
● automated dependencies
○ lik...
Buildout is like...
you need it when
- you’re on tour (deploy different places)
- very different components
Goodie #7: Plone
300+ core contributors
400+ plugins
1000+ commits/month
5-8 sprints per year
1 Plone foundation
1-2 CVE's...
Plone
Plone step 1: Install
wget --no-check-certificate https://launchpad.
net/plone/4.3/4.3.1/+download/Plone-4.3.1-
Unif...
Plone: #2 Add content
Plone Step 2: Add content
Plone Step 3: Add plugins
$ nano buildout.cfg
[instance]
...
eggs =
Products.PloneFormGen
collective.recaptcha
$ bin/build...
Plone Step 4: Theme it
Framework vs CMS
start with a blank page start with fully featured site
build up customise down
good for "app" sites good ...
Content Editor Site Admin
Separation of concerns
Backend devFrontend dev /
Themer
Integrator
Reviewer
Developers blog
Integrator
Static site generator
An app/startup
Backend devFrontend dev / Themer
Django/Pyramid
Simple Blog
Content Editor
PluginsThemes
Simple CMS e.g. Wordpress
Large content site
PluginsThemes
Frontend dev /
Themer
Content Editor Site Admin
Integrator
Reviewer
Enterprise CMS
Web consultancy
Plugins
Frontend dev /
Themer
Content Editor
Site Admin
Integrator CMS/Framework
The customisation cliff
Framework
CMS
Goodie #8: Diazo
- Ultimate in code - html seperation
- templates without altering your html
- allows designer to work on ...
Diazo.org
1. app with very simple html
- "content"
2. create mockups in html of
how you want the pages to
really look - "t...
Goodie #9:
RobotFramework
what you get when you put python, selenum
and BDD into a blender
RobotFramework
RobotFramework
● Not invented by Plone/Zope (Nokia did)
● but robotsuite was
● Used to test Plone
● Automated screenshots ...
Thanks
Dylan Jay (pretagov.com.au)
The goodies of zope, pyramid, and plone (2)
Upcoming SlideShare
Loading in...5
×

The goodies of zope, pyramid, and plone (2)

10,243

Published on

8 goodies you can take away, in any web or non web python project.

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

No Downloads
Views
Total Views
10,243
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
18
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

The goodies of zope, pyramid, and plone (2)

  1. 1. The goodies that Zope begat Pyramid, Plone, buildout + more Dylan Jay @djay75
  2. 2. Who am I? Dylan Jay Core Plone Contributor 1995 First web app (ISAPI) 1999 Built first e-commerce site (zope) 2003 Built first startup (IntroVino) 2004 Started PretaWeb/PretaGov (Plone0
  3. 3. Reasons for this talk History "Those who don't learn from history are doomed to add it as a feature of their framework" Better choices There is no perfect framework, only a perfect mess when you pick wrong Reuse
  4. 4. The goodies 1. Traversal 2. ZODB 3. ZTK Adapters 4. Sprints 5. Pyramid 6. Buildout 7. Plone + the customisation cliff 8. Diazo 9. RobotFramework - RobotSuite
  5. 5. Python family tree(web) Zope (1996-) ZTK (BlueBream) (2004-) Pylons/TurboGears (2005-2010)Django (2005-) Flask (2010-) RoR (2004-) Plone (1999-) BFG (2008-2010) CGI (1993-) httpd (1990-) NikolaPyramid (2010-)
  6. 6. Zope - wtf was that about? Back in 1996 ● webserver = path to file ● cgi = path to script + args ● OO - was very big ● Jim Fulton was on a plane traversal = path to object + '/' + method zope = zope object publishing environment
  7. 7. Goodie #1 - Traversal response = traverse(root, HTTP_PATH.split('/'), request) def traverse(context, path, request): if len(path) == 0: return context(request) elif len(path) == 1: view_method = getattr( context, path[0] ) return view_method(request) else: sub_context = context[ path[0] ] return traverse( sub_context, path[1:], request)
  8. 8. Traversal - why? Good for CMS plugins cooperating webapps complex apps TraversalRoutes /A/B/C/myaction/myaction/id123 distributedcentrally defined Good for relational single use apps
  9. 9. Goodie #2: ZODB ● Want to store something non relational? ● Want to store something non key-value? ● Got complex object structures? Use Object persistence
  10. 10. ZODB: The piss easy DB $ easyinstall ZODB db = DB( FileStorage.FileStorage('./Data.fs') ) connection = db.open() dbroot = connection.root() transaction.commit() db.close() dbroot['a_number'] = 3 dbroot['a_string'] = 'Gift' dbroot['a_list'] = [1, 2, 3, 5, 7, 12] dbroot['a_dictionary'] = { 1918: 'Red Sox', 1919: 'Reds' } dbroot['deeply_nested'] = { 1918: [ ('Red Sox', 4), ('Cubs', 2) ], 1919: [ ('Reds', 5), ('White Sox', 3) ], }
  11. 11. ZODB: simple but powerful ● transactions - multiversion concurrency control (MVCC) ● scalability across a network (using ZEO) ● replication (using ZRS or relstorage) ● history/undo ● transparently pluggable storage ● built-in caching ● Blob support
  12. 12. Goodie #3: Adapters
  13. 13. Adapters: why? ● Solves how to plug complex software together ● Better than Object Orientation ● Perfect for overridable software ● Perfect for plugin architecture ● ZTK - ZCA - Zope3 == Adapters
  14. 14. ZTK Adapters class IUSPlug(zope.interface): prongs = Attribute("""number of prongs""") class Motox(object): implements(IUSPlug) prongs = 2 class INZPlug(zope.interface): prongs = Attribute("""number of prongs""")
  15. 15. ZTK Adapters class ACPowerAdapter(object): implements(INZPlug) adapts(IUSPlug) def __init__(self, plug): self.prongs = plug.prongs + 1 self.voltage = 240 registry.registerAdapter(ACPowerAdapter)
  16. 16. ZTK Adapters >>> myphone = MotoX() >>> myphone.prongs == 3 False >>> adaptedphone = INZPlug(myphone) >>> adaptedphone.prongs == 3 True
  17. 17. Goodie #4: Sprints “The practice of using sprints for open source software development was pioneered by the Zope Corporation in the early days of the Zope 3 project. Between January 2002 and January 2006, more than 30 Zope 3 sprints had taken place.[citation needed]” Plone Pacific Rim Sprint 14-15 Sept
  18. 18. Goodie #5 Pyramid Zope (1996-) ZTK (BlueBream) (2004-) Pylons/TurboGears (2005-2010)Django (2005-) Flask (2010-) RoR (2004-) Plone (1999-) BFG (2008-2010) CGI (1993-) httpd (1990-) NikolaPyramid (2010-)
  19. 19. Pyramid: It's micro! from wsgiref.simple_server import make_server from pyramid.view import view_config from pyramid.config import Configurator if __name__ == '__main__': config = Configurator() config.add_route('hello', '/hello/{name}') config.scan() app = config.make_wsgi_app() server = make_server('0.0.0.0', 8080, app) server.serve_forever() @view_config(route_name='hello', renderer='json') def hello_world(request): return {'content':'Hello %(name)s!' % request.matchdict}
  20. 20. Pyramid: worst name ever Pyramid (the structure) Pyramid (the framework) Start big - End small Start small - End big Ancient Best of breed Unchanging over time Extensible & Flexible
  21. 21. Pyramid: a "micro & more" Framework ● a declarative authorization system ● extensibility: aggregate Pyramid application configuration from multiple sources ● separate I18N translation string factories ● reuse: "Interface" based view/subscriber registrations ● optionally map URLs to code using traversal
  22. 22. Pyramid: routes vs. traversal: why not both? from wsgiref.simple_server import make_server from pyramid.config import Configurator from pyramid.response import Response class Resource(dict): pass def get_root(request): return Resource({'a': Resource({'b': Resource({'c': Resource()})})}) def hello_world_of_resources(context, request): output = "Here's a resource and its children: %s" % context return Response(output) if __name__ == '__main__': config = Configurator(root_factory=get_root) config.add_view(hello_world_of_resources, context=Resource) app = config.make_wsgi_app() server = make_server('0.0.0.0', 8080, app) server.serve_forever()
  23. 23. Goodie #6: buildout buildout - what you get if you put make, puppet, python, pip, virtualenv into a blender
  24. 24. Buildout ● uses recipes - python packages that know how to build other things ○ like puppet ● automated dependencies ○ like Make ● recipes download and install python packages into your environment ○ like PIP/easy_install ● everything gets installed into a local directory isolated from your system ○ like virtualenv
  25. 25. Buildout is like... you need it when - you’re on tour (deploy different places) - very different components
  26. 26. Goodie #7: Plone 300+ core contributors 400+ plugins 1000+ commits/month 5-8 sprints per year 1 Plone foundation 1-2 CVE's/year
  27. 27. Plone Plone step 1: Install wget --no-check-certificate https://launchpad. net/plone/4.3/4.3.1/+download/Plone-4.3.1- UnifiedInstaller.tgz # Extract the downloaded file tar -xf Plone-4.3-UnifiedInstaller.tgz # Go the folder containing installer script cd Plone-4.3-UnifiedInstaller # Run script ./install.sh standalone cd ~/Plone/zinstance bin/instance fg
  28. 28. Plone: #2 Add content Plone Step 2: Add content
  29. 29. Plone Step 3: Add plugins $ nano buildout.cfg [instance] ... eggs = Products.PloneFormGen collective.recaptcha $ bin/buildout $ bin/instance fg
  30. 30. Plone Step 4: Theme it
  31. 31. Framework vs CMS start with a blank page start with fully featured site build up customise down good for "app" sites good for "content" sites others can edit Framework CMS startup tool agency tool risk reinventing the wheel risk hitting customisation cliff dev has full control shared control, editors, admin, dev, themer
  32. 32. Content Editor Site Admin Separation of concerns Backend devFrontend dev / Themer Integrator Reviewer
  33. 33. Developers blog Integrator Static site generator
  34. 34. An app/startup Backend devFrontend dev / Themer Django/Pyramid
  35. 35. Simple Blog Content Editor PluginsThemes Simple CMS e.g. Wordpress
  36. 36. Large content site PluginsThemes Frontend dev / Themer Content Editor Site Admin Integrator Reviewer Enterprise CMS
  37. 37. Web consultancy Plugins Frontend dev / Themer Content Editor Site Admin Integrator CMS/Framework
  38. 38. The customisation cliff Framework CMS
  39. 39. Goodie #8: Diazo - Ultimate in code - html seperation - templates without altering your html - allows designer to work on html while you work on the code - round trip
  40. 40. Diazo.org 1. app with very simple html - "content" 2. create mockups in html of how you want the pages to really look - "theme" 3. create a rules.xml. 4. Compile it to single XSLT file, 5. execute it in middleware
  41. 41. Goodie #9: RobotFramework what you get when you put python, selenum and BDD into a blender
  42. 42. RobotFramework
  43. 43. RobotFramework ● Not invented by Plone/Zope (Nokia did) ● but robotsuite was ● Used to test Plone ● Automated screenshots for user manuals
  44. 44. Thanks Dylan Jay (pretagov.com.au)
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×