5. What is Plone?#

Plone is an open source Content Management System (CMS) built in Python. A CMS lets non-technical people create and maintain information for a public website or an intranet using only a web browser.

  • Open-Source Enterprise-CMS

  • Written in Python

  • Plone 5.1 and below support Python 2

  • Plone 5.2 supports Python 3 and 2

  • Plone 6 supports Python 3

  • RESTful hypermedia API

  • Volto: React-based frontend and editor

  • Based on the Web-Framework Zope

  • Database: Zope Object Database ZODB or ORM & SQL/Postgres/Oracle

  • Runs on Linux, macOS, BSD, Solaris, NixOS and Windows

Plone has a multitude of powerful features, is easily accessible to editors but also fun for programmers.

  • Workflow-driven, collaborative management of content

  • Industrial Strength Security and Access-Control

  • Limitless Extensibility


The modular and open component architecture of Plone allows you to change or extend Plone in every respect!

5.1. Core concepts#

Here are the technical concepts that Plone uses. They make Plone special and distinguish it from most other systems.

5.1.1. Traversal#

  • Plone uses Traversal (portal/folder/document) instead of Routing

  • Python objects exists in a object tree that looks like a huge nested dictionary:

{'site': {'folder': {'page': page_object}}}
  • Objects can be accessed like walking through a file-system:

>>> from plone import api
>>> portal = api.portal.get()
>>> portal.keys()
['folder1', 'document1']
>>> portal['folder1']
<Folder at xxxx>

5.1.2. Object publishing#

Objects can be called and return a representation of itself - usually HTML.

>>> obj = portal['folder1']['a-newsitem']
>>> obj
<FolderishNewsItem at /Plone/folder1/a-newsitem>
>>> obj()
'\n<!DOCTYPE html>\n\n<html xmlns="http://www.w3.org/1999/xhtml...'

5.1.3. Schema-driven content#

Plone comes with a list of pre-defined content-types.

Content types are defined in models/schemas. A schema can define fields to store data.

Values of these fields are attributes on content objects.

>>> obj.title
'A Newsitem'
>>> obj.description
'Some description'
>>> obj.description = u'A new description'
>>> obj.description
'A new description'
>>> obj.image
<plone.namedfile.file.NamedBlobImage object at 0x113793b30 oid 0x7e0b in <Connection at 10e57cdc0>>
>>> obj.image.data

Objects can have multiple schemata. Additional schemata are called behaviors. They are meant to be used across content types to add shared functionality.

>>> from plone.dexterity.utils import iterSchemata
>>> [i for i in iterSchemata(self.context)]
[<InterfaceClass plone.dexterity.schema.generated.Plone_0_News_1_Item>,
 <SchemaClass plone.app.dexterity.behaviors.metadata.IDublinCore>,
 <SchemaClass plone.app.contenttypes.behaviors.richtext.IRichText>,
 <SchemaClass plone.app.dexterity.behaviors.discussion.IAllowDiscussion>,
 <SchemaClass plone.app.dexterity.behaviors.id.IShortName>,
 <SchemaClass plone.app.dexterity.behaviors.exclfromnav.IExcludeFromNavigation>,
 <SchemaClass plone.app.relationfield.behavior.IRelatedItems>,
 <SchemaClass plone.app.contenttypes.behaviors.leadimage.ILeadImage>,
 <SchemaClass plone.app.versioningbehavior.behaviors.IVersionable>]

Each behavior schema can define fields. The values of these fields are again attributes on content objects. Plone creates forms for all these schemata to add and edit content.

5.1.4. Component Architecture#

  • Plone logic is wired together by a component architecture.

  • A pluggable system of interfaces, adapters, utilities, events and registries.

  • ZCA: A Python framework for supporting component based design and programming

  • zope.interface

  • zope.event

  • zope.component

Written by smart people:

  • Jim Fulton

  • Stephan Richter

  • Philipp von Weitershausen

  • Guido van Rossum

  • Tres Seaver

  • Phillip J Eby

  • Martijn Faassen

  • ...

See also

5.1.5. Rest API#

plone.restapi is a hypermedia API to access Plone content using REST (Representational State Transfer).

It is used to connect the Volto frontend with Plone.

5.1.6. Volto Frontend#

Volto is a frontend for Plone 6 written in ReactJS. It uses the Rest API to communicate with the backend and offers a modern editing experience.

5.1.7. Classic Frontend#

A stable alternative to the JavaScript frontend Volto is the classic frontend of Plone that uses server-side rendered HTML. Plone ships with a default theme called Barceloneta. Since Plone 6 it uses Bootstrap 5.