Introduction

Extensions allow functionality to be added to the OpenFlexure Microscope web API without having to modify the base code. They have full access to the openflexure_microscope.Microscope object, including direct access to any attached openflexure_microscope.camera.base.BaseCamera and openflexure_stage.stage.OpenFlexureStage objects. This also allows access to the picamerax.PiCamera object.

Extensions can either be loaded from a single Python file, or as a Python package installed to the environment being used.

Single-file extensions

For adding simple functionality, such as a few basic functions and API routes, a single Python file can be loaded as a extension. This Python file must contain all of your extension objects, and be located in the applications extensions directory (by default /var/openflexure/extensions/microscope_extensions).

Package extensions

Generally, for adding anything other than very simple functionality, extensions should be written as package distributions. This has the advantage of allowing relative imports, so functionality can be easily split over several files. For example, class definitions associated with API routes can be separated from class definitions associated with the microscope extension.

Your module must be a folder within the extensions folder (by default /var/openflexure/extensions/microscope_extensions), and include a top-level __init__.py file which includes (or imports) all of your extension classes, and includes them in a global constant LABTHINGS_EXTENSIONS list.

For example, if your extension classes are defined in a file my_extension.py, your adjascent __init__.py file may look like:

from .my_extension import MyExtensionClass, MyOtherExtensionClass

LABTHINGS_EXTENSIONS = (MyExtensionClass, MyOtherExtensionClass)

In order to enable a globally installed, packaged extension, create a file in the applications extensions directory (by default /var/openflexure/extensions/microscope_extensions) which imports your extension object(s) from your module.