8.2 KiB
Contents API
notebook.services.contents
The Jupyter Notebook web application provides a graphical interface for creating, opening, renaming, and deleting files in a virtual filesystem.
The ~manager.ContentsManager
class defines an abstract
API for translating these interactions into operations on a particular
storage medium. The default implementation, ~filemanager.FileContentsManager
, uses the local
filesystem of the server for storage and straightforwardly serializes
notebooks into JSON. Users can override these behaviors by supplying
custom subclasses of ContentsManager.
This section describes the interface implemented by ContentsManager subclasses. We refer to this interface as the Contents API.
Data Model
notebook.services.contents.manager
Filesystem Entities
ContentsManager methods represent virtual filesystem entities as dictionaries, which we refer to as models.
Models may contain the following entries:
Key | Type | Info |
---|---|---|
name | unicode | Basename of the entity. |
path | unicode | Full (API-style<apipaths> ) path to the entity. |
type | unicode | The entity type. One of "notebook" , "file"
or "directory" . |
created | datetime | Creation date of the entity. |
last_modified | datetime | Last modified date of the entity. |
content | variable | The "content" of the entity. (See
Below<modelcontent> ) |
mimetype | unicode or None |
The mimetype of content , if any. (See
Below<modelcontent> ) |
format | unicode or None |
The format of content , if any. (See
Below<modelcontent> ) |
Certain model fields vary in structure depending on the
type
field of the model. There are three model types:
notebook, file, and
directory .
notebook
models-
- The
format
field is always"json"
. - The
mimetype
field is alwaysNone
. - The
content
field contains anbformat.notebooknode.NotebookNode
representing the .ipynb file represented by the model. See the NBFormat documentation for a full description.
- The
file
models-
- The
format
field is either"text"
or"base64"
. - The
mimetype
field istext/plain
for text-format models andapplication/octet-stream
for base64-format models. - The
content
field is always of typeunicode
. For text-format file models,content
simply contains the file's bytes after decoding as UTF-8. Non-text (base64
) files are read as bytes, base64 encoded, and then decoded as UTF-8.
- The
directory
models-
- The
format
field is always"json"
. - The
mimetype
field is alwaysNone
. - The
content
field contains a list ofcontent-free<contentfree>
models representing the entities in the directory.
- The
Note
In certain circumstances, we don't need the full content of an entity
to complete a Contents API request. In such cases, we omit the
mimetype
, content
, and format
keys from the model. This most commonly occurs when listing a directory,
in which circumstance we represent files within the directory as
content-less models to avoid having to recursively traverse and
serialize the entire filesystem.
Sample Models
# Notebook Model with Content
{'content': {
'metadata': {},
'nbformat': 4,
'nbformat_minor': 0,
'cells': [
{'cell_type': 'markdown',
'metadata': {},
'source': 'Some **Markdown**',
},
],
},'created': datetime(2015, 7, 25, 19, 50, 19, 19865),
'format': 'json',
'last_modified': datetime(2015, 7, 25, 19, 50, 19, 19865),
'mimetype': None,
'name': 'a.ipynb',
'path': 'foo/a.ipynb',
'type': 'notebook',
'writable': True,
}
# Notebook Model without Content
{'content': None,
'created': datetime.datetime(2015, 7, 25, 20, 17, 33, 271931),
'format': None,
'last_modified': datetime.datetime(2015, 7, 25, 20, 17, 33, 271931),
'mimetype': None,
'name': 'a.ipynb',
'path': 'foo/a.ipynb',
'type': 'notebook',
'writable': True
}
API Paths
ContentsManager methods represent the locations of filesystem resources as API-style paths. Such paths are interpreted as relative to the root directory of the notebook server. For compatibility across systems, the following guarantees are made:
- Paths are always
unicode
, notbytes
. - Paths are not URL-escaped.
- Paths are always forward-slash (/) delimited, even on Windows.
- Leading and trailing slashes are stripped. For example,
/foo/bar/buzz/
becomesfoo/bar/buzz
. - The empty string (
""
) represents the root directory.
Writing a Custom ContentsManager
The default ContentsManager is designed for users running the
notebook as an application on a personal computer. It stores notebooks
as .ipynb files on the local filesystem, and it maps files and
directories in the Notebook UI to files and directories on disk. It is
possible to override how notebooks are stored by implementing your own
custom subclass of ContentsManager
. For example, if you
deploy the notebook in a context where you don't trust or don't have
access to the filesystem of the notebook server, it's possible to write
your own ContentsManager that stores notebooks and files in a
database.
Required Methods
A minimal complete implementation of a custom ~manager.ContentsManager
must implement the following methods:
ContentsManager.get ContentsManager.save ContentsManager.delete_file ContentsManager.rename_file ContentsManager.file_exists ContentsManager.dir_exists ContentsManager.is_hidden
Customizing Checkpoints
TODO:
Testing
notebook.services.contents.tests
notebook.services.contents.tests
includes several test
suites written against the abstract Contents API. This means that an
excellent way to test a new ContentsManager subclass is to subclass our
tests to make them use your ContentsManager.
Note
PGContents is
an example of a complete implementation of a custom
ContentsManager
. It stores notebooks and files in PostgreSQL and encodes directories
as SQL relations. PGContents also provides an example of how to re-use
the notebook's tests.