Nathan van Gheem and Ramon Navarro Bosch: guillotina and asyncio

published Oct 18, 2017

Talk by Nathan van Gheem and Ramon Navarro Bosch at the Plone Conference 2017 in Barcelona.

At first we had plone.server as name, but it was not really Plone anymore, so we were looking for a new name and come up with guillotine, and then Ramon said we should call it guillotina, the Catalan name for it.

Some background. There are web frameworks like Angular and React. Server rendering frameworks are dying out: the front end just wants to talk to an API. We love Plone, but wanted to be able to use it in high performant situations with modern front ends.


  • 18 years ago, Zope and the ZODB were created, an object oriented application and database.
  • 16 years ago Plone got built on top of it.
  • 7 years ago Pyramid created.
  • 2 years ago Plone REST API created
  • a bit more than one year ago plone.server/guillotina was born.

Guillotina is an evolution, done in the spirit of Plone. It is not necessarily a replacement for Plone. We are taking lessons learned. We are okay with forking some code to change it to our needs. We are not going to provide everything out of the box. Zope and Plone are inspirations, they are in our heads, like the hierarchical data model. It is not a re-implementation of Plone, it is not plone.restapi compatible. It is an asynchronous REST API service.

We have transactions, with conflict resolution policies that reduce conflict errors and gives better performance. We want to use the best database systems available, we support PostgreSQL and CockroachDB.

Information is organised in trees of objects. We love that in Plone and decided to keep it. Objects are resources, with schema attributes and annotations, OO inheritance and static or dynamic behaviors. The data is serialised as json.

Other features:

  • Security: similar to how this is in Zope and Plone, but simplified.
  • All code is based on asyncio for network integrations with external indexers, database, caching, services. It is based on aioHTTP.
  • We want the installation to be simple. You can do pip install guillotina or docker run guillotina/guillotina.
  • You can configure how CORS should be handled.
  • It is easy to use web sockets.
  • It is perfect for micro services, like handled in lots of containers with kubernetis.
  • It is extensible, uses zope.interface and based on zope.component, with utilities and adapters.
  • You can use Cookie Cutter to create a new project.
  • We have a persistent configuration registry for each container. A container is comparable with a Plone Site inside a Zope database.
  • You can point to a static directory for static files and javascript apps.
  • You can mount multiple databases at the same time.
  • We have open sourced our S3 and GCloud storage packages, and ElasticSearch indexing.
  • Automatic API documentation generation using Swagger. With guillotina-swagger you get clickable documentation where you can try everything out.
  • Give a container 200 MB of RAM and it will handle hundreds of requests per second.
  • Urls are like: /db/container-name/obj1/obj2
  • zope.interface is the only package that we kept from Zope/Plone.
  • Only Python 3.6 or higher.
  • Hopefully we get some reusable components that are also used for the Plone REST API.