Getting started¶
Installation¶
$ pip install kinto
You can use Kinto-Core by doing import kinto.core in your application.
More details about installation and storage backend is provided in a dedicated section.
Start a Pyramid project¶
As detailed in Pyramid documentation, create a minimal application, or use its scaffolding tool:
$ pcreate -s starter MyProject
Include Kinto-Core¶
In the application main file (e.g. MyProject/myproject/__init__.py),
just add some extra initialization code:
import pkg_resources
import kinto.core
from pyramid.config import Configurator
# Module version, as defined in PEP-0396.
__version__ = pkg_resources.get_distribution(__package__).version
def main(global_config, **settings):
config = Configurator(settings=settings)
kinto.core.initialize(config, __version__, 'myproject')
return config.make_wsgi_app()
By doing that, basic features like authentication, monitoring, error formatting,
deprecation indicators are now available, and rely on configuration present
in development.ini.
Run!¶
With some backends, like PostgreSQL, some tables and indices have to be created. A generic command is provided to accomplish this:
$ kinto --ini development.ini migrate
Like any Pyramid application, it can be served locally with:
$ pserve development.ini --reload
A hello view is now available at http://localhost:6543/v0/ (As well as basic endpoints like the utilities).
The next steps will consist in building a custom application using Cornice or the Pyramid ecosystem.
But most likely, it will consist in defining REST resources using Kinto-Core‘s Python API !
Authentication¶
Currently, if no authentication is set in settings, Kinto-Core relies on Basic Auth. It will associate a unique user id for every user/password combination.
Using HTTPie, it is as easy as:
$ http -v http://localhost:6543/v0/ --auth user:pass
Note
In the case of Basic Auth, there is no need of registering a user/password. Pick any combination, and include them in each request.
Define resources¶
In order to define a resource, inherit from kinto.core.resource.UserResource,
in a subclass, in myproject/views.py for example:
from kinto.core import resource
@resource.register()
class Mushroom(resource.UserResource):
# No schema yet.
pass
In application initialization, make Pyramid aware of it:
def main(global_config, **settings):
config = Configurator(settings=settings)
kinto.core.initialize(config, __version__, 'myproject')
config.scan("myproject.views")
return config.make_wsgi_app()
In order to bypass the installation and configuration of Redis or PostgreSQL,
specify the «in-memory» backends in development.ini:
# development.ini
myproject.cache_backend = kinto.core.cache.memory
myproject.storage_backend = kinto.core.storage.memory
myproject.permission_backend = kinto.core.permission.memory
A Mushroom resource API is now available at the /mushrooms/ URL.
It will accept a bunch of REST operations (GET, POST, ...).
The next step consists in attaching a schema to the resource, to control what fields are accepted and stored.
Schema validation¶
It is possible to validate records against a predefined schema, associated to the resource.
Currently, only Colander is supported, and it looks like this:
import colander
from kinto.core import resource
class MushroomSchema(resource.ResourceSchema):
name = colander.SchemaNode(colander.String())
class Options:
preserve_unknown = False # Fails if field is unknown!
@resource.register()
class Mushroom(resource.UserResource):
mapping = MushroomSchema()
Enable middleware¶
In order to enable WSGI middleware, wrap the application in the project main function:
def main(global_config, **settings):
config = Configurator(settings=settings)
kinto.core.initialize(config, __version__, 'myproject')
config.scan("myproject.views")
app = config.make_wsgi_app()
return kinto.install_middlewares(app, settings)
What’s next ?¶
Resource customization¶
See the resource documentation to specify custom URLs, schemaless resources, read-only fields, record pre-processing...
Advanced initialization¶
-
kinto.core.initialize(config, version=None, project_name='', default_settings=None)¶ Initialize kinto.core with the given configuration, version and project name.
This will basically include kinto.core in Pyramid and set route prefix based on the specified version.
Parameters: - config (Configurator) – Pyramid configuration
- version (str) – Current project version (e.g. ‘0.0.1’) if not defined in application settings.
- project_name (str) – Project name if not defined in application settings.
- default_settings (dict) – Override kinto.core default settings values.
Beyond Kinto-Core¶
Kinto-Core is just a component! The application can still be built and extended using the full Pyramid ecosystem.