Getting started

In these narrative docs, we’ll go through creating a todo application.

Installation

pip install guillotina

Generating the initial application

Guillotina comes with a cookiecutter template for creating a base application.

First, install cookiecutter if it isn’t already installed.

pip install cookiecutter

Then, run the generate command:

guillotina create --template=application

Enter guillotina_todo for package_name.

Then, install your package:

cd guillotina_todo
python setup.py develop

Configuring

The scaffold produces an initial config.yaml configuration file for you.

You can inspect and customize your configuration. Most notable is the database configuration. If you want to run a development PostgreSQL server, use docker:

docker run --rm \
  -e POSTGRES_DB=guillotina \
  -e POSTGRES_USER=guillotina \
  -p 127.0.0.1:5432:5432 \
  --name postgres postgres:9.6

Creating to-do type

Types consist of an interface (schema) using the excellent zope.interface package and a class that uses that interface.

Create a guillotina_todo/content.py file with the following:

from guillotina import configure
from guillotina import schema
from guillotina import interfaces
from guillotina import content


class IToDo(interfaces.IItem):
    text = schema.Text()


@configure.contenttype(
    type_name="ToDo",
    schema=IToDo)
class ToDo(content.Item):
    """
    Our ToDo type
    """

Then, we want to make sure our content type configuration is getting loaded, so add this to your __init__.py includeme function:

from guillotina import configure
configure.scan('guillotina_todo.content')

Running

You run you application by using the guillotina command runner again:

guillotina serve -c config.yaml

Creating your todo list

Create container first:

http

POST /db/ HTTP/1.1
Accept: application/json
Authorization: Basic cm9vdDpyb290
Content-Type: application/json
Host: localhost:8080

{
    "@type": "Container",
    "description": "My todo list",
    "id": "todo",
    "title": "ToDo List"
}

curl

curl -i -X POST http://localhost:8080/db/ -H 'Accept: application/json' -H 'Content-Type: application/json' --data-raw '{"@type": "Container", "description": "My todo list", "id": "todo", "title": "ToDo List"}' --user root:root

wget

wget -S -O- http://localhost:8080/db/ --header='Accept: application/json' --header='Content-Type: application/json' --post-data='{"@type": "Container", "description": "My todo list", "id": "todo", "title": "ToDo List"}' --auth-no-challenge --user=root --password=root

httpie

echo '{
  "@type": "Container",
  "description": "My todo list",
  "id": "todo",
  "title": "ToDo List"
}' | http POST http://localhost:8080/db/ Accept:application/json Content-Type:application/json -a root:root

python-requests

requests.post('http://localhost:8080/db/', headers={'Accept': 'application/json', 'Content-Type': 'application/json'}, json={'@type': 'Container', 'description': 'My todo list', 'id': 'todo', 'title': 'ToDo List'}, auth=('root', 'root'))

response

HTTP/1.1 200 OK
Content-Type: application/json
Location: /db/todo

{
    "@type": "Container",
    "id": "todo",
    "title": "ToDo List"
}

Install your todo list application:

http

POST /db/todo/@addons HTTP/1.1
Accept: application/json
Authorization: Basic cm9vdDpyb290
Content-Type: application/json
Host: localhost:8080

{
    "id": "guillotina_todo"
}

curl

curl -i -X POST http://localhost:8080/db/todo/@addons -H 'Accept: application/json' -H 'Content-Type: application/json' --data-raw '{"id": "guillotina_todo"}' --user root:root

wget

wget -S -O- http://localhost:8080/db/todo/@addons --header='Accept: application/json' --header='Content-Type: application/json' --post-data='{"id": "guillotina_todo"}' --auth-no-challenge --user=root --password=root

httpie

echo '{
  "id": "guillotina_todo"
}' | http POST http://localhost:8080/db/todo/@addons Accept:application/json Content-Type:application/json -a root:root

python-requests

requests.post('http://localhost:8080/db/todo/@addons', headers={'Accept': 'application/json', 'Content-Type': 'application/json'}, json={'id': 'guillotina_todo'}, auth=('root', 'root'))

response

HTTP/1.1 200 OK
Content-Type: application/json

{
    "available": [
        {
            "id": "guillotina_todo",
            "title": "Guillotina server application python project"
        }
    ],
    "installed": [
        "guillotina_todo"
    ]
}

Add todo items:

http

POST /db/todo HTTP/1.1
Accept: application/json
Authorization: Basic cm9vdDpyb290
Content-Type: application/json
Host: localhost:8080

{
    "@type": "ToDo",
    "text": "Get milk"
}

curl

curl -i -X POST http://localhost:8080/db/todo -H 'Accept: application/json' -H 'Content-Type: application/json' --data-raw '{"@type": "ToDo", "text": "Get milk"}' --user root:root

wget

wget -S -O- http://localhost:8080/db/todo --header='Accept: application/json' --header='Content-Type: application/json' --post-data='{"@type": "ToDo", "text": "Get milk"}' --auth-no-challenge --user=root --password=root

httpie

echo '{
  "@type": "ToDo",
  "text": "Get milk"
}' | http POST http://localhost:8080/db/todo Accept:application/json Content-Type:application/json -a root:root

python-requests

requests.post('http://localhost:8080/db/todo', headers={'Accept': 'application/json', 'Content-Type': 'application/json'}, json={'@type': 'ToDo', 'text': 'Get milk'}, auth=('root', 'root'))

response

HTTP/1.1 201 Created
Content-Type: application/json
Location: http://localhost:8080/db/todo/385ac34a49bc406f8494600c50b99a85

{
    "@id": "http://localhost:8080/db/todo/385ac34a49bc406f8494600c50b99a85",
    "@name": "385ac34a49bc406f8494600c50b99a85",
    "@type": "ToDo",
    "@uid": "5c9|385ac34a49bc406f8494600c50b99a85",
    "UID": "5c9|385ac34a49bc406f8494600c50b99a85"
}

http

POST /db/todo HTTP/1.1
Accept: application/json
Authorization: Basic cm9vdDpyb290
Content-Type: application/json
Host: localhost:8080

{
    "@type": "ToDo",
    "text": "Do laundry"
}

curl

curl -i -X POST http://localhost:8080/db/todo -H 'Accept: application/json' -H 'Content-Type: application/json' --data-raw '{"@type": "ToDo", "text": "Do laundry"}' --user root:root

wget

wget -S -O- http://localhost:8080/db/todo --header='Accept: application/json' --header='Content-Type: application/json' --post-data='{"@type": "ToDo", "text": "Do laundry"}' --auth-no-challenge --user=root --password=root

httpie

echo '{
  "@type": "ToDo",
  "text": "Do laundry"
}' | http POST http://localhost:8080/db/todo Accept:application/json Content-Type:application/json -a root:root

python-requests

requests.post('http://localhost:8080/db/todo', headers={'Accept': 'application/json', 'Content-Type': 'application/json'}, json={'@type': 'ToDo', 'text': 'Do laundry'}, auth=('root', 'root'))

response

HTTP/1.1 201 Created
Content-Type: application/json
Location: http://localhost:8080/db/todo/77332e3153a54924b9b36eb263848826

{
    "@id": "http://localhost:8080/db/todo/77332e3153a54924b9b36eb263848826",
    "@name": "77332e3153a54924b9b36eb263848826",
    "@type": "ToDo",
    "@uid": "5c9|77332e3153a54924b9b36eb263848826",
    "UID": "5c9|77332e3153a54924b9b36eb263848826"
}

Get a list of todo items:

http

GET /db/todo HTTP/1.1
Accept: application/json
Authorization: Basic cm9vdDpyb290
Host: localhost:8080

curl

curl -i http://localhost:8080/db/todo -H 'Accept: application/json' --user root:root

wget

wget -S -O- http://localhost:8080/db/todo --header='Accept: application/json' --auth-no-challenge --user=root --password=root

httpie

http http://localhost:8080/db/todo Accept:application/json -a root:root

python-requests

requests.get('http://localhost:8080/db/todo', headers={'Accept': 'application/json'}, auth=('root', 'root'))

response

HTTP/1.1 200 OK
Content-Type: application/json

{
    "@id": "http://localhost:8080/db/todo",
    "@name": "todo",
    "@type": "Container",
    "@uid": "5c9932350eaf4ff189d7db934222216b",
    "UID": "5c9932350eaf4ff189d7db934222216b",
    "__behaviors__": [],
    "__name__": "todo",
    "creation_date": "2018-07-21T15:39:11.411162+00:00",
    "is_folderish": true,
    "items": [
        {
            "@id": "http://localhost:8080/db/todo/385ac34a49bc406f8494600c50b99a85",
            "@name": "385ac34a49bc406f8494600c50b99a85",
            "@type": "ToDo",
            "@uid": "5c9|385ac34a49bc406f8494600c50b99a85",
            "UID": "5c9|385ac34a49bc406f8494600c50b99a85"
        },
        {
            "@id": "http://localhost:8080/db/todo/77332e3153a54924b9b36eb263848826",
            "@name": "77332e3153a54924b9b36eb263848826",
            "@type": "ToDo",
            "@uid": "5c9|77332e3153a54924b9b36eb263848826",
            "UID": "5c9|77332e3153a54924b9b36eb263848826"
        }
    ],
    "length": 2,
    "modification_date": "2018-07-21T15:39:11.411162+00:00",
    "parent": {},
    "title": "ToDo List",
    "type_name": "Container",
    "uuid": "5c9932350eaf4ff189d7db934222216b"
}